Пример склонения слов в javascript
Категория: Алгоритмы и программирование
Комментарии: 18
Для склонения числовых значений будем использовать небольшую javascript функцию. В качестве аргументов ей передаётся число и массив из форм слова. Рассмотрим 2 варианта написания такой функции.
function declOfNum(number, words) { return words[(number % 100 > 4 && number % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][(number % 10 < 5) ? Math.abs(number) % 10 : 5]]; }
тоже самое, но другим синтаксисом:
function declOfNum(n, text_forms) { n = Math.abs(n) % 100; var n1 = n % 10; if (n > 10 && n < 20) { return text_forms[2]; } if (n1 > 1 && n1 < 5) { return text_forms[1]; } if (n1 == 1) { return text_forms[0]; } return text_forms[2]; }
Пример:
declOfNum(1, ['минута', 'минуты', 'минут']); // вернёт — минута declOfNum(2, ['минута', 'минуты', 'минут']); // вернёт — минуты declOfNum(5, ['минута', 'минуты', 'минут']); // вернёт — минут
На практике можно применять следующим образом:
document.getElementById('p1').innerHTML = '1 ' + declOfNum(1, ['минута', 'минуты', 'минут']); // или на jQuery $('#p2').html('2 '+declOfNum(2, ['минута', 'минуты', 'минут'])); $('#p3').html('5 '+declOfNum(5, ['минута', 'минуты', 'минут']));
Результат:
Вариант использования, когда значение вводится пользователем в текстовое поле. Для удобства используем jQuery.
// html <input id="num" type="number" value="1" min="0" max="100" step="1" /> <span id="num-word">год</span> // script $('#num').on('change',function(){ val = declOfNum($(this).val(), ['год', 'года', 'лет']); $('#num-word').text(val); });
Результат: год
Так, изменяя падежи слова, можно составлять грамматически верные предложения с использованием числительных переменных.
Мне кажется я допустил ошибку…
jQuery можно подключить так:
от этого нет смысла, т.к. есть return text_forms[2];
А то самому писать формулу это такое.
Есть небольшая поправка, в сокращенном виде не хватает Math.abs
Получается для 55 выполнится секунд — этот кусок кода (number % 100 > 4 && number % 100 < 20)? 2. То есть будет выбран «секунд» в массиве, но я не пойму, почему 55 дает остаток больше 4 и меньше 20. Помоги разобраться.
55/100 = 0.55 (Остаток 55? хм не пойму)