Страница 1 из 2

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

Добавлено: 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

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

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 />'; ?>

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

Добавлено: 19 авг 2010, 21:32
Doker
намек понят =)

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

Добавлено: 19 авг 2010, 21:34
Александр
Doker
:) да многим может пригодиться)

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

Добавлено: 19 авг 2010, 22:24
Noise Gate
Александр
забыл про 11,12,13,14 дней

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

Добавлено: 19 авг 2010, 23:43
Александр
Noise Gate
Да, от 5 до 20 всегда "дней".

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

Добавлено: 20 авг 2010, 00:27
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, не уверен в работоспособности, но может пригодится.

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

Добавлено: 20 авг 2010, 09:00
Noise Gate
Александр писал(а):Да, от 5 до 20 всегда "дней".
точно... сначала не понял алгоритма с сотнями, сейчас распробовал)))

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

Добавлено: 20 авг 2010, 22:45
Александр
alexei
Если работает правильно, то код может быть даже лучше.
Логику кода, который я выложил, придумал не я. Когда-то давно изменял код под себя, за время использования багов не было.

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

Добавлено: 20 авг 2010, 23:24
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>
Тестируем

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

Добавлено: 23 ноя 2010, 19:09
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 - непосредственно число.