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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Склонение существительных с числительными

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
evgenijj
Отправлено: 08 Октября, 2007 - 16:19:39
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




В русском языке существительные с числительными могут быть в единственном, двойственном и множественном числе: один арбуз, два арбуза, пять арбузов (двойственное число — это почти исчезнувшая в русском языке грамматическая конструкция, встречающаяся только в этом случае).
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.  
 
 Top
EuGen Администратор
Отправлено: 08 Октября, 2007 - 18:38:15
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




У меня было некоторое обобщение (собственно похоже), а именно:
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.  


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
563434
Отправлено: 09 Августа, 2009 - 11:59:32
Post Id


Новичок


Покинул форум
Сообщений всего: 10
Дата рег-ции: Авг. 2009  


Помог: 0 раз(а)




Из этого сделал мой вариант, учитывающий ноль:

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. }
 
 Top
WiciN
Отправлено: 06 Октября, 2009 - 06:08:01
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Нояб. 2007  
Откуда: Симферополь


Помог: 0 раз(а)




563434 пишет:
Из этого сделал мой вариант, учитывающий ноль:

Может я что-то упустил, никак не могу понять для чего учитывать ноль?
Если $forms=array('секунда', 'секунды', 'секунд' ); то при 0, 10, 20 … 100… и так далее вернётся 'секунд', всё как положено, зачем запрещать вывод слова при нуле?


-----
Настоящий программист должен иметь быстрые руки, грязную голову и холодное пиво.
 
 Top
EuGen Администратор
Отправлено: 06 Октября, 2009 - 13:21:04
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Автор поста, может, это не учел


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Yakim
Отправлено: 17 Мая, 2010 - 21:09:38
Post Id


Новичок


Покинул форум
Сообщений всего: 31
Дата рег-ции: Янв. 2010  
Откуда: Симферополь


Помог: 0 раз(а)




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. }

(Отредактировано автором: 17 Мая, 2010 - 21:11:50)

 
 Top
Ch_chov
Отправлено: 18 Мая, 2010 - 06:00:57
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2121
Дата рег-ции: Июль 2008  
Откуда: из города


Помог: 90 раз(а)




В 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. }
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Пользовательские функции »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB