
Думаю, что ещё более ранние модели отличались совсем просто — они говорили: «Солдат Крис Катарн, убил 10 враг, потратил 342 патрон, получил 0 ранение» и т. п., чем сразу палились.
Ведь до сих пор, несмотря на развитие веба, на многих сайтах можно встретить «50 пользователи», «1 комментарии», «0 сообщения» и т. п. А ведь насколько приятней, когда сайт говорит с тобой на человеческом языке и правильно спрягает слова по числам.
И ведь сделать это совсем несложно. Ниже приведены простые готовые функции, которые позволяют решить эту проблему на PHP и Javascript. Они настолько просты, что не составит труда перенести их на любой другой язык.
В функцию передаётся число сущностей, для которого нужно подобрать окончания, и массив слов (или окончаний для слов) для чисел 1, 4 и 5. Например ['устрица', 'устрицы', 'устриц'].
PHP
- /**
- * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
- * param $number Integer Число на основе которого нужно сформировать окончание
- * param $endingsArray Array Массив слов или окончаний для чисел (1, 4, 5),
- * например array('яблоко', 'яблока', 'яблок')
- * return String
- */
- function getNumEnding($number, $endingArray)
- {
- $number = $number % 100;
- if ($number>=11 && $number<=19) {
- $ending=$endingArray[2];
- }
- else {
- $i = $number % 10;
- switch ($i)
- {
- case (1): $ending = $endingArray[0]; break;
- case (2):
- case (3):
- case (4): $ending = $endingArray[1]; break;
- default: $ending=$endingArray[2];
- }
- }
- return $ending;
- }
JavaScript
- /**
- * Функция возвращает окончание для множественного числа слова на основании числа и массива окончаний
- * param iNumber Integer Число на основе которого нужно сформировать окончание
- * param aEndings Array Массив слов или окончаний для чисел (1, 4, 5),
- * например ['яблоко', 'яблока', 'яблок']
- * return String
- */
- function getNumEnding(iNumber, aEndings)
- {
- var sEnding, i;
- iNumber = iNumber % 100;
- if (iNumber>=11 && iNumber<=19) {
- sEnding=aEndings[2];
- }
- else {
- i = iNumber % 10;
- switch (i)
- {
- case (1): sEnding = aEndings[0]; break;
- case (2):
- case (3):
- case (4): sEnding = aEndings[1]; break;
- default: sEnding = aEndings[2];
- }
- }
- return sEnding;
- }
Не забудьте отдельно обработать случай, для числа 0. Просто написать, например, «0 записей» не достаточно. Нужно как минимум написать «Записей нет» или изменить дизайн, скрыв вообще пустой блок с записями.
UPD: Спасибо IGlukhovу за то, что поправил неграмотное название!