Пятничный js-сниппет: склоняем существительные и прилагательные

Пятничный 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,'свежее', 'свежих') // Вернет «свежих» 

 

Надеюсь, кому-нибудь пригодится. Для пущей наглядности, сделал небольшую демку.

 Демо

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 28

mikai
Здорово, спасибо!
А с отключенным js - как отобразится?
#
mikai
AntonYu
очевидно, что просто не вызовется функция.
#
AntonYu
Evgenij
У этой функции не будет смысла, если js отключен.
Она полезна для отображения количества новых комментариев (которое периодически обновляется AJAX'ом).

Кстати, эту функцию несложно перевести на другие языки (чаще такую задачу все-таки приходится делать на стороне сервера)

На C# она будет выглядеть почти идентично. Если читатели помогут перевести на другие языки (PHP, Python, Ruby, etc.) буду крайне благодарен и приложу к статье.
Артём Сапегин
Я всегда пользуюсь вот такой, выдранной из gettext:

function plural(n, forms) {
	return forms[n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2];
}
Евгений
Спасибо, Артем. В сокращенном виде выглядит круто.
Дмитрий
3 яблок, супер
#
Дмитрий
Евгений
Дмитрий, вы наверное, что-то неправильно сделали. Функция работает правильно и возвращает "3 яблока","4 яблока" но "5 яблок"
Evgenij
Спасибо, Петр, поправил.
И благодарю за PHP-версию.
vredniy
крутая реализация, мне очень понравилась
RagnarR
Отличная статья. Как раз появилась необходимость использовать склонения.
#
RagnarR  
akatadke
Мне всегда хватало одной функции, например:

GetNoun(6, "свежее яблоко", "свежих яблока", "свежих яблок")
#
akatadke
Dr.Death
моя php версия
function plural($num, $form1, $form2, $form5) {
	$num = abs($num);
	if($num > 100) $num %= 100;
	if($num > 20) $num %= 10;

	switch($num) {
		case 1: return $form1;
		case 2:
		case 3:
		case 4: return $form2;
		default: return $form5;
	}
}
k0
у вас ошибка в тексте,
=1 — яблоко
=2 — яблока
>2 — яблок

может надо так >5 — яблок

#
k0
k0
т е >4
#
k0
Дмитрий
Спасибо, идея склонения была похожая, с помощью вашей стати скорректировал в узком месте. Тестирую.
Flip:Who?
Класс!
Обязательно использую ;)
Игорь
Будем использовать при разаработки сайтов в студии IP-ART
Alex
А есть нечто подобное, чтобы цифровое число переводить программно в словестное, т.е. 2451050 -> два миллиона, четыреста пятьдесят одна тысяча, пятьдесят ...тугриков...

Может кто-то встречал, ато самому писать лениво:)
#
Alex
darya
Спасибо за то, что поделились такой полезной информацией, добавляю себе статейку в закладки!!!
Yuriy
Спасибо за информативный и понятный пост, мне он помог решить немного другую задачу, а именно, грамотно склонить в сниппете название дней и месяцев в календаре!
Max
Очень интересно) Я у себя писал тоже что-то подобное только реализация была на PHP. Можно посмотреть здесь
#
Max
GreatRash
А как же 0?
#
GreatRash
Evgenij
С нулем все окей.
Александр
Ноль лучше заменить на < Нет >. Нет яблок лучше, чем 0 яблок
Igor Timoshenko
http://translate.sourceforge.net/wiki/l10n/pluralforms

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler