22 декабря 2015
30 апреля 2010
28
Пятничный js-сниппет: склоняем существительные и прилагательные
В сегодняшней статье я хочу поделиться парой полезных js-функций. Их задача —правильно выбрать существительное или прилагательное в зависимости от числа, которое им предшествует.
Типа «1 свежая статья», «2 свежих статьи» и т.д.
Многие ленивые программисты делают вывод в другом виде : «новых комментариев — 1». Но это мягко говоря не по-русски, а по-программистски.
Агентство «Идеал» — продвижение сайта
и другие маркетинговые услуги.
Итак, нам понадобится две функции. Одна для склонения существительных, другая для склонения прилагательных.
Склонение существительных
Про правила. В зависимости от того, в какую количественную группу попадает существительное, выбирается то или иное окончание.
- 1 — яблоко
- 2 — яблока
- 5 — яблок
Отрицательные числа обрабатываются точно также, как и их абсолютные значения.
Сама функция:
GetNoun = function(number, one, two, five) {
number = Math.abs(number);
number %= 100;
if (number >= 5 && number <= 20) {
return five;
}
number %= 10;
if (number == 1) {
return one;
}
if (number >= 2 && number <= 4) {
return two;
}
return five;
}
Как видите, в функцию задаются четыре параметра — само число и три строчных параметра, которые соответствуют склонению существительного с числами 1, 2 и 5 соотв.
Пример использования:
GetNoun(6, 'яблоко', 'яблока', 'яблок') // Вернет «яблок»
Склонение прилагательных
Со склонением прилагательных все еще проще.
Если число оканчивается на 1 (но не 11), то выбирается «свежее».
Иначе «свежих».
GetAdj = function(number, one, two) {
number %= 100;
if (number == 11) return two;
number %= 10;
if (number == 1) return one;
return two;
}
Пример использования
GetAdj(6,'свежее', 'свежих') // Вернет «свежих»
Надеюсь, кому-нибудь пригодится. Для пущей наглядности, сделал небольшую демку.
А с отключенным js - как отобразится?
Она полезна для отображения количества новых комментариев (которое периодически обновляется AJAX'ом).
Кстати, эту функцию несложно перевести на другие языки (чаще такую задачу все-таки приходится делать на стороне сервера)
На C# она будет выглядеть почти идентично. Если читатели помогут перевести на другие языки (PHP, Python, Ruby, etc.) буду крайне благодарен и приложу к статье.
И благодарю за PHP-версию.
=1 — яблоко
=2 — яблока
>2 — яблок
может надо так >5 — яблок
Обязательно использую ;)
Может кто-то встречал, ато самому писать лениво:)