Склонение месяцев на PHP и JS

  • 5 935
  • Нет комментариев
Календарь

Сегодня мы научимся преобразовывать месяцы в года и склонять их. Например, есть у вас 242 месяца, а вам нужно всё это представить в удобочитаемом виде, т.е. вот так: «20 лет 2 месяца». Причём функция должна правильно подставлять слова типа   «год», «года», «лет», «месяц», «месяца», «месяцев». Полезная задача, не так ли? Я расскажу как это сделать на PHP и на JS.

Постановка задачи

Написать функцию, которая принимает целое число  и преобразует его в вид типа «20 лет 2 месяца». Реализовать это на PHP и на JS.

Преобразовываем месяцы на PHP

/**
 * Преобразует месяцы в строку вида "2 года 1 месяц"
 * @param int $num Количество месяцев
 * @return string
 */
function prettyDate($num)
{
    /**
     * Определяет правильное с точки зрения русского языка окончание месяца
     * @param int $num
     * @param array $postfixes
     * @return string
     */
    function postfix($num, $postfixes)
    {
        //Делим число без остатка на 100
        $num = $num % 100;

        //Если больше 19, делим его без остатка ещё раз, уже на 10
        if ($num > 19)
        {
            $num = $num % 10;
        }

        //В зависимости от того, какие числа остались, возвращаем значения
        switch ($num)
        {
            case 1:
                return $postfixes[0];

            case 2: case 3: case 4:
                return $postfixes[1];

            default:
                return $postfixes[2];
        }
    }

    //Определяем массивы с годами и месяцами
    $yearsPostfixes = array('год', 'года', 'лет');
    $monthesPostfixes = array('месяц', 'месяца', 'месяцев');

    //Делим начальное число без остатка на 12, получаем количество месяцев
    $monthes = $num % 12;
    //Отнимаем из начального числа количество месяцев и делим это на 12,
    //получаем количество лет
    $years = ($num - $monthes) / 12;

    //Возвращаем результат postfix() зависимости от значений $years и $monthes
    if ($years === 0)
    {
        return $monthes.' '.postfix($monthes, $monthesPostfixes);
    }

    if ($monthes === 0)
    {
        return $years.' '.postfix($years, $yearsPostfixes);
    }

    return $years
                .' '.postfix($years, $yearsPostfixes)
                .' '.$monthes
                .' '.postfix($monthes, $monthesPostfixes);
}

echo prettyDate(25); //2 года 1 месяц

 Преобразовываем месяцы на JS

/**
 * Преобразует месяцы в строку вида "2 года 1 месяц"
 * @param int $num Количество месяцев
 * @return string
 */
function prettyDate(num)
{
    /**
     * Определяет правильное с точки зрения русского языка окончание месяца
     * @param int $num
     * @param array $postfixes
     * @return string
     */
    function postfix(num, postfixes)
    {
        //Делим число без остатка на 100
        num = num % 100;

        //Если больше 19, делим его без остатка ещё раз, уже на 10
        if (num > 19)
        {
            num = num % 10;
        }

        //В зависимости от того, какие числа остались, возвращаем значения
        switch (num)
        {
            case 1:
                return postfixes[0];

            case 2: case 3: case 4:
                return postfixes[1];

            default:
                return postfixes[2];
        }
    }

    //Определяем массивы с годами и месяцами
    var yearsPostfixes = ['год', 'года', 'лет'],
        monthesPostfixes = ['месяц', 'месяца', 'месяцев'];

    //Делим начальное число без остатка на 12, получаем количество месяцев
    var monthes = num % 12,
        //Отнимаем из начального числа количество месяцев и делим это на 12,
        //получаем количество лет
        years = (num - monthes) / 12;

    //Возвращаем результат postfix() зависимости от значений $years и $monthes
    if (years === 0)
    {
        return monthes + ' ' + postfix(monthes, monthesPostfixes);
    }

    if (monthes === 0)
    {
        return years + ' ' + postfix(years, yearsPostfixes);
    }

    return years
                + ' ' + postfix(years, yearsPostfixes)
                + ' ' + monthes
                + ' ' + postfix(monthes, monthesPostfixes);
}

console.log(prettyDate(22)); //1 год 10 месяцев
Понравилась статья? Оцени её!
Комментарии (0)
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *