Пример склонения слов в 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);
});
Результат: год
Так, изменяя падежи слова, можно составлять грамматически верные предложения с использованием числительных переменных.
События клавиатуры в JavaScript
Основы работы с хранилищем Vuex
Перебор элементов на JavaScript
Как получить url текущей страницы на JavaScript
Событие onclick в javascript и jquery на примерах
Простой таймер на JavaScript
Мне кажется я допустил ошибку…
<script> $('#num').on('change',function(){ val = num2str($(this).val(), ['год', 'года', 'лет']); $('#num-word').text(val); }); function num2str(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]; } </script><script> $(function(){ function num2str(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]; } $('#num').on('change',function(){ val = num2str($(this).val(), ['год', 'года', 'лет']); $('#num-word').text(val); }); }); </script>jQuery можно подключить так:от этого нет смысла, т.к. есть return text_forms[2];
А то самому писать формулу это такое.
Есть небольшая поправка, в сокращенном виде не хватает Math.abs
Получается для 55 выполнится секунд — этот кусок кода (number % 100 > 4 && number % 100 < 20)? 2. То есть будет выбран «секунд» в массиве, но я не пойму, почему 55 дает остаток больше 4 и меньше 20. Помоги разобраться.
55/100 = 0.55 (Остаток 55? хм не пойму)