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

Уроки по PHP, Javascript и т.п.
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

Сообщение Александр »

Правильные окончания слов
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

Код: Выделить всё

function num_ending(number) {    var endings = ['дней','день','дня'];    var num100 = number % 100;    var num10 = number % 10;    if (num100 >= 5 && num100 <= 20) {        return endings[0];    } else if (num10 == 0) {        return endings[0];    } else if (num10 == 1) {        return endings[1];    } else if (num10 >= 2 && num10 <= 4) {        return endings[2];    } else if (num10 >= 5 && num10 <= 9) {        return endings[0];    } else {        return endings[2];    }} var days = 50;trace(days + ' ' + num_ending(days));days = 51;trace(days + ' ' + num_ending(days));days = 52;trace(days + ' ' + num_ending(days));

PHP

Код: Выделить всё

<?phpfunction num_ending($number) {    $endings = Array('дней','день','дня');    $num100 = $number % 100;    $num10 = $number % 10;    if ($num100 >= 5 && $num100 <= 20) {        return $endings[0];    } else if ($num10 == 0) {        return $endings[0];    } else if ($num10 == 1) {        return $endings[1];    } else if ($num10 >= 2 && $num10 <= 4) {        return $endings[2];    } else if ($num10 >= 5 && $num10 <= 9) {        return $endings[0];    } else {        return $endings[2];    }} $days = 50;echo $days.' '.num_ending($days).'<br />';$days = 51;echo $days.' '.num_ending($days).'<br />';$days = 52;echo $days.' '.num_ending($days).'<br />'; ?>
Аватара пользователя
Doker
Модератор
Модератор
Сообщения: 1026
Зарегистрирован: 07 май 2010, 18:53

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

Сообщение Doker »

намек понят =)
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

Сообщение Александр »

Doker
:) да многим может пригодиться)
Noise Gate
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34

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

Сообщение Noise Gate »

Александр
забыл про 11,12,13,14 дней
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

Сообщение Александр »

Noise Gate
Да, от 5 до 20 всегда "дней".
Аватара пользователя
alexei
Разработчик
Разработчик
Сообщения: 836
Зарегистрирован: 21 янв 2010, 19:44

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

Сообщение alexei »

Код: Выделить всё

        function ArifRes(res) {            if ((res < 5) && (res > 20)) {                if (res == 1) {                    return " пользователь";                }                else if ((res % 10 > 1) && (res % 10 < 5)) {                    return " пользователя";                }            }            else {                return " пользователей";            }        }
Писал на JS, не уверен в работоспособности, но может пригодится.
Noise Gate
Сообщения: 691
Зарегистрирован: 28 апр 2010, 12:34

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

Сообщение Noise Gate »

Александр писал(а):Да, от 5 до 20 всегда "дней".
точно... сначала не понял алгоритма с сотнями, сейчас распробовал)))
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

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

Сообщение Александр »

alexei
Если работает правильно, то код может быть даже лучше.
Логику кода, который я выложил, придумал не я. Когда-то давно изменял код под себя, за время использования багов не было.
Аватара пользователя
alexei
Разработчик
Разработчик
Сообщения: 836
Зарегистрирован: 21 янв 2010, 19:44

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

Сообщение alexei »

Ошибся.

Код: Выделить всё

<html><head><title></title><script type="text/javascript" charset="cp1251">    function ArifRes(res) {        if ((res % 100 < 5) || (res % 100 > 20)) {            if (res % 10 == 1) {                return " пользователь";            }            if ((res % 10 > 1) && (res % 10 < 5)) {                return " пользователя";            }            return " пользователей";        }        else {            return " пользователей";        }    }    alert(ArifRes(101));</script></head><body></body></html>
Тестируем
azzzi
Сообщения: 164
Зарегистрирован: 13 сен 2010, 19:24

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

Сообщение azzzi »

я в таких случаях использую универсальную функцию, чтобы не быть привязанным к определенным словам!!!

Код: Выделить всё

 function takesklon($n, $form1, $form2, $form3) {        $takesklon = ($n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 or $n % 100 >= 20) ? 1 : 2));        switch($takesklon) {            case 0:            default:                return $form1;            case 1:                return $form2;            case 2:                return $form3;        }    }  
юзать так:

Код: Выделить всё

 echo takesklon($peremen, 'человек', 'человека', 'человек');echo takesklon($peremen, 'рубль', 'рубля', 'рублей');echo takesklon($peremen, 'день', 'дня', 'дней');
и так далее, $peremen - непосредственно число.
Ответить