У першій частині Термінатора Ріс Кайл розповідає про те, як круто роботи навчилися маскуватися під людей. Що зараз у них справжнє шкіра і волосся, вони пітніють і т. п. Про попередні ж моделі він говорив, що їх легко було відрізнити за гумовою шкірою.
Думаю, що ще більш ранні моделі відрізнялися зовсім просто - вони говорили: «Солдат Кріс Катарн, убив 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: Спасибі IGlukhovy за те, що поправив неграмотну назву!