Pull to refresh

Война с роботами: склонение существительных после числительных

Website development *
Робот в кармашкеВ первой части Терминатора Рис Кайл рассказывает о том, как круто роботы научились маскироваться под людей. Что сейчас у них настоящие кожа и волосы, они потеют и т. п. Про предыдущие же модели он говорил, что их легко было отличить по резиновой коже.

Думаю, что ещё более ранние модели отличались совсем просто — они говорили: «Солдат Крис Катарн, убил 10 враг, потратил 342 патрон, получил 0 ранение» и т. п., чем сразу палились.

Ведь до сих пор, несмотря на развитие веба, на многих сайтах можно встретить «50 пользователи», «1 комментарии», «0 сообщения» и т. п. А ведь насколько приятней, когда сайт говорит с тобой на человеческом языке и правильно спрягает слова по числам.

И ведь сделать это совсем несложно. Ниже приведены простые готовые функции, которые позволяют решить эту проблему на PHP и Javascript. Они настолько просты, что не составит труда перенести их на любой другой язык.

В функцию передаётся число сущностей, для которого нужно подобрать окончания, и массив слов (или окончаний для слов) для чисел 1, 4 и 5. Например ['устрица', 'устрицы', 'устриц'].

PHP



  1. /**
  2.  * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
  3.  * param  $number Integer Число на основе которого нужно сформировать окончание
  4.  * param  $endingsArray  Array Массив слов или окончаний для чисел (1, 4, 5),
  5.  *         например array('яблоко', 'яблока', 'яблок')
  6.  * return String
  7.  */
  8. function getNumEnding($number, $endingArray)
  9. {
  10.     $number = $number % 100;
  11.     if ($number>=11 && $number<=19) {
  12.         $ending=$endingArray[2];
  13.     }
  14.     else {
  15.         $i = $number % 10;
  16.         switch ($i)
  17.         {
  18.             case (1): $ending = $endingArray[0]; break;
  19.             case (2):
  20.             case (3):
  21.             case (4): $ending = $endingArray[1]; break;
  22.             default: $ending=$endingArray[2];
  23.         }
  24.     }
  25.     return $ending;
  26. }


JavaScript


  1. /**
  2.  * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
  3.  * param  iNumber Integer Число на основе которого нужно сформировать окончание
  4.  * param  aEndings Array Массив слов или окончаний для чисел (1, 4, 5),
  5.  *         например ['яблоко', 'яблока', 'яблок']
  6.  * return String
  7.  */
  8. function getNumEnding(iNumber, aEndings)
  9. {
  10.     var sEnding, i;
  11.     iNumber = iNumber % 100;
  12.     if (iNumber>=11 && iNumber<=19) {
  13.         sEnding=aEndings[2];
  14.     }
  15.     else {
  16.         i = iNumber % 10;
  17.         switch (i)
  18.         {
  19.             case (1): sEnding = aEndings[0]; break;
  20.             case (2):
  21.             case (3):
  22.             case (4): sEnding = aEndings[1]; break;
  23.             default: sEnding = aEndings[2];
  24.         }
  25.     }
  26.     return sEnding;
  27. }


Не забудьте отдельно обработать случай, для числа 0. Просто написать, например, «0 записей» не достаточно. Нужно как минимум написать «Записей нет» или изменить дизайн, скрыв вообще пустой блок с записями.

UPD: Спасибо IGlukhovу за то, что поправил неграмотное название!
Tags:
Hubs:
Total votes 95: ↑63 and ↓32 +31
Views 57K
Comments Comments 122