@HellWalk

Как сделать правильную приставку к количеству лет?

Есть цифра, к ней необходимо сделать приписку, обозначающую годы, но, в зависимости от количества, приписка должна быть разная:

1 год
2 года
3 года
4 года
5 лет
6 лет
7 лет
и т.д.

Т.к. задача довольно банальна - возможно уже придумано какое-то готовое решение для данной цели. Кто-нибудь знает?
  • Вопрос задан
  • 174 просмотра
Решения вопроса 1
@HellWalk Автор вопроса
Спасибо всем за ответы, сразу в примерах, но мне больше всего понравился вариант, который предложили на другом форуме:

function declination($n = 0, $year)
{
    $year = explode('|', $year);
    $n    = intval($n);
    return $n % 10 == 1 && $n % 100 != 11 ? $year[0]  : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? $year[1] : $year[2]);
}
echo '5 ' . declination(5, 'год|года|лет');


Его и отмечу решением.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
/*
echo plural_form(42, array('арбуз', 'арбуза', 'арбузов')); 
*/
function plural_form($n, $forms) {
  return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
}

Источник
Ответ написан
Комментировать
хоть это и js, но синтаксис практически такой же, можно и на пхп переписать
export function declOfNum(num, titles) {
    const cases = [2, 0, 1, 1, 1, 2];
    return titles[(num % 100 > 4 && num % 100 < 20)
        ? 2
        : cases[(num % 10 < 5) ? num % 10 : 5]
        ];
}

declOfNum(3, ['день', 'дня', 'дней']) // дня
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function numeral(num, v1, v2, v5) {
  mod100 = num % 100;
  mod10 = num % 10;
  if ((mod100 >= 11 && mod100 <= 19) || mod10 >= 5 || mod10 == 0) {
    return v5;
  }
  if (mod10 == 1) {
    return v1;
  }
  return v2;
}
echo numeral(121, 'год', 'года', 'лет");
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
/**
    * Returns plural form
    * @param integer $n number of items
    * @param string $one
    * @param string $some
    * @param string $many
    * @example echo  plural_form(42, 'арбуз', 'арбуза', 'арбузов');
    */
    public static function pluralForm($n, $one, $some, $many) {
        return $n%10==1&&$n%100!=11?$one:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$some:$many);
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы