Сегодня мы научимся преобразовывать месяцы в года и склонять их. Например, есть у вас 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 месяцев