RealAdmin.ru

Пример склонения слов в javascript

Пример склонения слов в javascript
Категория: Кодинг
Комментарии: 7

Для склонения числовых значений будем использовать небольшую javascript функцию. В качестве аргументов ей передаётся число и массив из форм слова. Рассмотрим 2 варианта написания такой функции.

function declOfNum(number, words) {  
    return words[(number % 100 > 4 && number % 100 < 20) ? 2 : [2, 0, 1, 1, 1, 2][(number % 10 < 5) ? 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];
}

Применяется функция следующим образом:

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);
});

Результат: год

Так, изменяя падежи слова, можно составлять грамматически верные предложения с использованием числительных переменных.

Темы:
Посмотрите похожее — 6
Комментарии —
  1. Мишка24 февраля 2019, 21:01#
    Андрей, здравствуй. Помоги пожалуйста с построением кода. Как будет выглядеть готовый код для вставки? К примеру вариант с минутами...))
    1. Andy Si24 февраля 2019, 22:14#
      Добрый вечер. Так в статье есть пример, меняется только селектор, куда вставляется слово — у каждого он свой.
      1. Мишка25 февраля 2019, 16:18#
        Вставил в таком порядке, но отображения нету :((

        Мне кажется я допустил ошибку…

        <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>
        
        
        1. Andy Si25 февраля 2019, 16:25#
          Убедись, что у тебя на сайте подключена библиотека jquery. И код попробуй поменять на этот:
          <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 можно подключить так:
          <script src="https://code.jquery.com/jquery-git.min.js"></script>
    2. Кирилл25 августа 2019, 19:52#
      if (n > 10 && n < 20) { return text_forms[2]; }
      от этого нет смысла, т.к. есть return text_forms[2];
      1. Andy Si26 августа 2019, 08:44(был изменён)#
        Не совсем так. Если этого условия не будет, то может сработать 2е или 3е условие с переменной n1, а до return text_forms[2]; дело не дойдет и мы получим неправильное значение.
      2. Mark17 июня 2020, 20:24#
        Спасибо. Отлично работает!
        :p :) :a :q :s :r ;) :( :E:j :u:\ :o
        © REALADMIN.RU   2020 г.
        Страница сгенерирована: 0,1651 s | 6 mb.
        На каком уровне Вы играете в шахматы?
        О П Р О С