понедельник, 23 июля 2012 г.

"1 окно", "22 окна" или работаем с числительными (.NET)

Вот потребовалось мне как-то в .NET-приложении показывать юзеру, что у него на странице было "38 посещений".
Сделал. Быстро, красиво, замечательно. Прибавил юзеру еще 3 посещения и увидел, что у него "41 посещений". Некрасиво, незамечательно. Хочется, чтобы в зависимости от некоего числа выбиралась корректная форма слова. В Django для таких дел существует pluralize. В .NET? /* пожал плечами */
Быстрый поиск не помог, поэтому решение было героически быстро накидано.
string wordForm = Numerizer.GetForm(41, "посещение", "посещения", "посещений");
И тут ВНЕЗАПНО (!!) приложению понадобилось быть многоязычным :). А т.к. мысль пошла дальше, масштабнее, то захотелось иметь под рукой более солидное средство, нежели накиданный на скорую руку класс.
Для начала интересность задачи: языков в мире много и все они разные (в арабском вон 6 числительных форм слова о_О). Их описание (с кодами языков по ISO) было найдено здесь:
http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
После чего была рождена библиотечка Numerizr.NET и помещена на GitHub.
Она очень проста и подробный пример опять же приведен на гитхабе, но пару строчек для первого взгляда оставлю здесь:
// формы слова
string[] wordForms = {"окно", "окна", "окон"};
// примеры чисел
int[] numbersInt = {0, 1, 2, 3, 10, 21, 50, 111, -20};
// поехали выводить наши тестовые данные
foreach (int num in numbersInt)
{
    string word = numerizr.Numerize(num, wordForms);
    Console.WriteLine("{0} {1}", num, word);
}

Вот что увидим:
0 окон
1 окно
2 окна
3 окна
10 окон
21 окно
50 окон
111 окон
-3 окна
src: https://github.com/elgris/Numerizr.NET 

Комментариев нет:

Отправить комментарий