MyTetra Share
Делитесь знаниями!
Алгоритм склонения существительных после числительных
Время создания: 09.10.2010 12:56
Текстовые метки: алгоритм, язык
Раздел: Компьютер - Программирование - Алгоритмы
Запись: xintrea/mytetra_syncro/master/base/0000001623/text.html на raw.github.com

Алгоритм склонения существительных после числительных

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

Думаю, что ещё более ранние модели отличались совсем просто — они говорили: «Солдат Крис Катарн, убил 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 записей» не достаточно. Нужно как минимум написать «Записей нет» или изменить дизайн, скрыв вообще пустой блок с записями.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования