Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Склонение существительных с числительными
Форумы портала PHP.SU » PHP » Пользовательские функции » Склонение существительных с числительными

Страниц (1): [1]
 

1. evgenijj - 08 Октября, 2007 - 16:19:39 - перейти к сообщению
В русском языке существительные с числительными могут быть в единственном, двойственном и множественном числе: один арбуз, два арбуза, пять арбузов (двойственное число — это почти исчезнувшая в русском языке грамматическая конструкция, встречающаяся только в этом случае).
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. function pluralForm($n, $form1, $form2, $form5)
  4. {
  5.     $n = abs($n) % 100;
  6.     $n1 = $n % 10;
  7.     if ($n > 10 && $n < 20) return $form5;
  8.     if ($n1 > 1 && $n1 < 5) return $form2;
  9.     if ($n1 == 1) return $form1;
  10.     return $form5;
  11. }
  12.  
  13. // пример использования
  14. echo 'В Вашем почтовом ящике '.$n.' '.pluralForm($n, 'письмо', 'письма', 'писем');
  15. ?>
  16.  
2. EuGen - 08 Октября, 2007 - 18:38:15 - перейти к сообщению
У меня было некоторое обобщение (собственно похоже), а именно:
PHP:
скопировать код в буфер обмена
  1.  
  2. function get_rus($fd, $forms)
  3. {
  4.     if (!is_int($fd)&&is_float($fd))//а уж число ли это?
  5.        return $forms[2];
  6.     elseif(is_int($fd))
  7.     {
  8.        $prc = abs($fd) % 100;
  9.        $prc_sec = $prc % 10;
  10.        if ($prc_add == 1)
  11.           return $forms[0];
  12.        if ($prc > 10 && $prc < 20)
  13.           return $forms[2];
  14.        if ($prc_add > 1 && $prc_add < 5)
  15.           return $forms[1];
  16.        return $forms[2];
  17.     };
  18.     return false;//нефик подсовывать ерунду
  19. }
  20. $fd=1.8;
  21. $forms=array('секунда', 'секунды', 'секунд');
  22. echo 'Осталось '.$fd.' '.get_rus($fd, $forms);
  23.  
3. 563434 - 09 Августа, 2009 - 11:59:32 - перейти к сообщению
Из этого сделал мой вариант, учитывающий ноль:

PHP:
скопировать код в буфер обмена
  1. Function GetWordForm($n, $forms)
  2. {
  3.     if ($n>0)
  4.     {
  5.         $n = abs($n) % 100;
  6.         $n1 = $n % 10;
  7.         if ($n > 10 && $n < 20) return $forms[2];
  8.         if ($n1 > 1 && $n1 < 5) return $forms[1];
  9.         if ($n1 == 1) return $forms[0];
  10.     }
  11.     return $forms[2];
  12. }
4. WiciN - 06 Октября, 2009 - 06:08:01 - перейти к сообщению
563434 пишет:
Из этого сделал мой вариант, учитывающий ноль:

Может я что-то упустил, никак не могу понять для чего учитывать ноль?
Если $forms=array('секунда', 'секунды', 'секунд' ); то при 0, 10, 20 … 100… и так далее вернётся 'секунд', всё как положено, зачем запрещать вывод слова при нуле?
5. EuGen - 06 Октября, 2009 - 13:21:04 - перейти к сообщению
Автор поста, может, это не учел
6. Yakim - 17 Мая, 2010 - 21:09:38 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. function declOfNum($number, $titles){
  2.     $cases = array (2, 0, 1, 1, 1, 2);
  3.     return $number . ' ' . $titles[($number % 100 > 4 && $number % 100 < 20) ? 2 : $cases[min($number % 10, 5)] ] . ' ';
  4. }
7. Ch_chov - 18 Мая, 2010 - 06:00:57 - перейти к сообщению
В gettext для русского языка используется такое правило формирования множественных чисел:
CODE (text):
скопировать код в буфер обмена
  1. "Plural-Forms: nplurals=3; plural=((((n%10)==1)&&((n%100)!=11))?(0):(((((n%10)>=2)&&((n%10)<=4))&&(((n%100)<10)||((n%100)>=20)))?(1):2));\n"



На PHP по этой формуле функция склонения русских существительных будет такая:
PHP:
скопировать код в буфер обмена
  1. function plural_form($n, $forms) {
  2.   return $n%10==1&&$n%100!=11?$forms[0]:($n%10>=2&&$n%10<=4&&($n%100<10||$n%100>=20)?$forms[1]:$forms[2]);
  3. }

 

Powered by ExBB FM 1.0 RC1