Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Склонение счетных слов 
:(
    Опции темы
Aliance
Дата 7.7.2009, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Недавно реализовал алгоритм, с помощью которого удачно склоняются слова при счёте. Например:
Цитата

1 товар
2 товара
4 товара
5 товаров
12 товаров
23 товара


При реализации я заметил, что есть три группы слов:
  • товар - 1,21,31,41,51,101,121 и т.д. (все, заканчивающиеся на 1, но не на 11)
  • товара - 2,3,4,22,33,44 и т.д. (все, заканчивающиеся на 2,3 или 4, но не на 12,13,14)
  • товаров - все остальные

Мой алгоритм примерно таков:
Код

if ( число <= 4 И число > 14 )
{
    if (число заканчивается на 1)
    {
        результат = число;
    }
    elseif (число заканчивается на 2,3 или 4)
    {
        результат = число + 'а';
    }
    else
    {
        результат = число + 'ов';
    }
}
else
{
    результат = число + 'ов';
}


Но мне мое решение честно говоря не кажется оптимальным. Хотя оно конечно во много раз лучше найденных мною в интернете.
Может быть у кого-то есть свои мысли на этот счет?
PM MAIL WWW ICQ Skype   Вверх
Photon
Дата 7.7.2009, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Злобный программер
**


Профиль
Группа: Участник
Сообщений: 282
Регистрация: 27.2.2009
Где: Таганрог

Репутация: нет
Всего: 12



Код

    /*
    *  Функция определения склонения слова по числу
    *  param num - число
    *  param ed - слово в ед. числе
    *  param mn_a - слово в им. падеже множ. числа
    *  param mn - слово в род. падеже множ. числа
    *
    *  Пример вызова: alert(Declention(25, 'товар', 'товара', 'товаров'));
    */  
    function Declention(num, ed, mn_a, mn) {
        var a = num % 100;
        if (a < 11) {
            var b = cnt % 10;
            if (b == 1)  
                end = ed;
            else if (b > 1 && b < 5)
                end = mn_a;
            else         
                end = mn;
        }
        else 
            var end = mn;
        return num + ' ' + end;
    }






Это сообщение отредактировал(а) Photon - 7.7.2009, 15:31


--------------------
With best regards..
PM MAIL ICQ Skype GTalk Jabber   Вверх
Soah
Дата 7.7.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 13
Всего: 54



Photon, 
Код

    alert(Declention(22, 'товар', 'товара', 'товаров')); // алертится 22 товаров


Aliance, так ты ведь уже описал алгоритм smile 
Код

    function declination(num) {
        var k = num % 10;
        var str;
        
        if (k == 1 && num != 11)
            str = "товар";
        else if (2 <= k && k <= 4 && num != k+10)
            str = "товара";
        else
            str = "товаров";
            
        return num + "  " + str;
    }


Добавлено через 8 минут и 57 секунд
или так
Код

    function declination(num) {
        var k = num % 10;
        var str = "товар";
        
        if (2 <= k && k <= 4 && num != k+10)
            str = "товара";
        else if (k != 1 || num == 11)
            str = "товаров";
            
        return num + "  " + str;
    }

PM MAIL   Вверх
Aliance
Дата 10.7.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 17
Всего: 137



Цитата(Soah @  7.7.2009,  18:05 Найти цитируемый пост)
Aliance, так ты ведь уже описал алгоритм

Я же написал, что с его помощью я задачу решил, но мне кажется, что не оптимально.


Soah, твой первый код сработает не правильно как минимум при числах 111, 1111 и т.д.


Photon, я конечно уже одним глазом засыпаю, но все же мне кажется, что в Вашем коде переменная cnt не определена ;-)
PM MAIL WWW ICQ Skype   Вверх
Soah
Дата 10.7.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 13
Всего: 54



Код

    function declination(num) {
        var k = num % 10;
        var d = num % 100;
        var str;
        
        if (k == 1 && d != 11)   // заканчивающиеся на 1, но не на 11
            str = "товар";
        else if (2 <= k && k <= 4 && d != k+10)   // заканчивающиеся на 2,3 или 4, но не на 12,13,14
            str = "товара";
        else    // остальные
            str = "товаров";
            
        return num + "  " + str;
    }

PM MAIL   Вверх
SelenIT
Дата 11.7.2009, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 7
Всего: 401



До кучи: http://fastcoder.org/articles/?aid=145 (особенно способ 2;)


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.