Правильные окончания слов

Уроки по PHP, Javascript и т.п.

Правильные окончания слов

Сообщение Александр » 19 авг 2010, 21:06

Правильные окончания слов
Actionscript 3.0, PHP

Функция может пригодится, если нужно изменять окончание существительного при указании количества чего-либо.

Логика:
Может быть всего 3 формы существительного.
Рассмотрим на примере слова "День".
0 - дней
1 - день
2 - дня

Окончание зависит от последних двух цифр числа (остаток при делении на 100).
Если остаток от 5 до 20, то всегда 0 - "дней".
Дальше достаточно последней цифры числа (остаток при делении на 10).
Если остаток 0 или от 5 до 9, то будет значение 0 - "дней".
Если 1, то значение 1 - "день".
Если от 2 до 4, то значение 2 - "дня".

ActionScript 3.0
  1. function num_ending(number) {
  2.     var endings = ['дней','день','дня'];
  3.     var num100 = number % 100;
  4.     var num10 = number % 10;
  5.     if (num100 >= 5 && num100 <= 20) {
  6.         return endings[0];
  7.     } else if (num10 == 0) {
  8.         return endings[0];
  9.     } else if (num10 == 1) {
  10.         return endings[1];
  11.     } else if (num10 >= 2 && num10 <= 4) {
  12.         return endings[2];
  13.     } else if (num10 >= 5 && num10 <= 9) {
  14.         return endings[0];
  15.     } else {
  16.         return endings[2];
  17.     }
  18. }
  19.  
  20. var days = 50;
  21. trace(days + ' ' + num_ending(days));
  22. days = 51;
  23. trace(days + ' ' + num_ending(days));
  24. days = 52;
  25. trace(days + ' ' + num_ending(days));



PHP
  1. <?php
  2. function num_ending($number) {
  3.     $endings = Array('дней','день','дня');
  4.     $num100 = $number % 100;
  5.     $num10 = $number % 10;
  6.     if ($num100 >= 5 && $num100 <= 20) {
  7.         return $endings[0];
  8.     } else if ($num10 == 0) {
  9.         return $endings[0];
  10.     } else if ($num10 == 1) {
  11.         return $endings[1];
  12.     } else if ($num10 >= 2 && $num10 <= 4) {
  13.         return $endings[2];
  14.     } else if ($num10 >= 5 && $num10 <= 9) {
  15.         return $endings[0];
  16.     } else {
  17.         return $endings[2];
  18.     }
  19. }
  20.  
  21. $days = 50;
  22. echo $days.' '.num_ending($days).'<br />';
  23. $days = 51;
  24. echo $days.' '.num_ending($days).'<br />';
  25. $days = 52;
  26. echo $days.' '.num_ending($days).'<br />';
  27.  
  28. ?>

За это сообщение автора Александр поблагодарили - 2:
butuz, Евгений
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Чтобы убрать блок с рекламой, зарегистрируйтесь на форуме или войдите.

Google
 



Re: Правильные окончания слов

Сообщение Doker » 19 авг 2010, 21:32

намек понят =)
my icq numbers: 403305362 и 484613
Аватара пользователя
Doker
Модератор
Модератор
 
Сообщения: 1026
Зарегистрирован: 07 май 2010, 18:53
Благодарил (а): 35 раз.
Поблагодарили: 52 раз.

Re: Правильные окончания слов

Сообщение Александр » 19 авг 2010, 21:34

Doker
:) да многим может пригодиться)
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Re: Правильные окончания слов

Сообщение Noise Gate » 19 авг 2010, 22:24

Александр
забыл про 11,12,13,14 дней
Noise Gate

 
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34
Откуда: СПб
Благодарил (а): 31 раз.
Поблагодарили: 64 раз.

Re: Правильные окончания слов

Сообщение Александр » 19 авг 2010, 23:43

Noise Gate
Да, от 5 до 20 всегда "дней".
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Re: Правильные окончания слов

Сообщение alexei » 20 авг 2010, 00:27

  1.        function ArifRes(res) {
  2.             if ((res < 5) && (res > 20)) {
  3.                 if (res == 1) {
  4.                     return " пользователь";
  5.                 }
  6.                 else if ((res % 10 > 1) && (res % 10 < 5)) {
  7.                     return " пользователя";
  8.                 }
  9.             }
  10.             else {
  11.                 return " пользователей";
  12.             }
  13.         }

Писал на JS, не уверен в работоспособности, но может пригодится.
http://appslessons.com/ — Мой блог посвященный урокам приложений ВКонтакте
Аватара пользователя
alexei
Разработчик
Разработчик
 
Сообщения: 836
Зарегистрирован: 21 янв 2010, 19:44
Откуда: Rostov-on-Don
Благодарил (а): 5 раз.
Поблагодарили: 54 раз.

Re: Правильные окончания слов

Сообщение Noise Gate » 20 авг 2010, 09:00

Александр писал(а):Да, от 5 до 20 всегда "дней".

точно... сначала не понял алгоритма с сотнями, сейчас распробовал)))
Noise Gate

 
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34
Откуда: СПб
Благодарил (а): 31 раз.
Поблагодарили: 64 раз.

Re: Правильные окончания слов

Сообщение Александр » 20 авг 2010, 22:45

alexei
Если работает правильно, то код может быть даже лучше.
Логику кода, который я выложил, придумал не я. Когда-то давно изменял код под себя, за время использования багов не было.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
 
Автор темы
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45
Откуда: Санкт-Петербург
Благодарил (а): 126 раз.
Поблагодарили: 771 раз.

Re: Правильные окончания слов

Сообщение alexei » 20 авг 2010, 23:24

Ошибся.
  1. <html>
  2. <head><title></title>
  3. <script type="text/javascript" charset="cp1251">
  4.     function ArifRes(res) {
  5.         if ((res % 100 < 5) || (res % 100 > 20)) {
  6.             if (res % 10 == 1) {
  7.                 return " пользователь";
  8.             }
  9.             if ((res % 10 > 1) && (res % 10 < 5)) {
  10.                 return " пользователя";
  11.             }
  12.             return " пользователей";
  13.         }
  14.         else {
  15.             return " пользователей";
  16.         }
  17.     }
  18.     alert(ArifRes(101));
  19. </script>
  20. </head>
  21. <body></body>
  22. </html>

Тестируем
http://appslessons.com/ — Мой блог посвященный урокам приложений ВКонтакте
Аватара пользователя
alexei
Разработчик
Разработчик
 
Сообщения: 836
Зарегистрирован: 21 янв 2010, 19:44
Откуда: Rostov-on-Don
Благодарил (а): 5 раз.
Поблагодарили: 54 раз.

Re: Правильные окончания слов

Сообщение azzzi » 23 ноя 2010, 19:09

я в таких случаях использую универсальную функцию, чтобы не быть привязанным к определенным словам!!!
  1.  
  2. function takesklon($n, $form1, $form2, $form3) {
  3.         $takesklon = ($n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 or $n % 100 >= 20) ? 1 : 2));
  4.         switch($takesklon) {
  5.             case 0:
  6.             default:
  7.                 return $form1;
  8.             case 1:
  9.                 return $form2;
  10.             case 2:
  11.                 return $form3;
  12.         }
  13.     }
  14.  
  15.  

юзать так:
  1.  
  2. echo takesklon($peremen, 'человек', 'человека', 'человек');
  3. echo takesklon($peremen, 'рубль', 'рубля', 'рублей');
  4. echo takesklon($peremen, 'день', 'дня', 'дней');


и так далее, $peremen - непосредственно число.
azzzi

 
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24
Благодарил (а): 12 раз.
Поблагодарили: 9 раз.

След.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в Уроки на другие темы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0