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