Как преобразовать кардинальные числа в порядковые

Есть ли простой способ преобразовать числа 1, 2, 3, ... в «1-й», «2-й», «3-й», ... и таким образом, чтобы я мог дать функции язык и иметь он вернет мне правильную форму для языка, на который я ориентируюсь? Либо стандартный C ++ (stl или boost OK), MFC или ATL, win32 api, либо небольшая, одноцелевая и бесплатная библиотека, которую я могу скачать откуда-нибудь. Спасибо.


person Roel    schedule 25.09.2008    source источник


Ответы (5)


Я сомневаюсь, что это вообще возможно, поскольку во многих языках эта форма будет зависеть от контекста, например, от пола или падежа существительного, которое он описывает, а для разных языков потребуется разная контекстная информация, чтобы определить правильную форму.

РЕДАКТИРОВАТЬ: например. на польском это «5-ta klasa» (5-й класс) vs. «5-ty miesiąc» (5-й месяц) vs. «w 5-tym miesiącu» (в 5-м месяце).

person Jacek Szymański    schedule 30.09.2008
comment
У вас есть какие-то конкретные языки или примеры? AFAIK, но мой практический опыт ограничен западноевропейскими языками, порядковый номер (1-й, 2-й) всегда один и тот же, и спрягается только полностью прописанная форма (например, el secundo mano / la secunda dia на испанском языке). - person Roel; 30.09.2008
comment
Интересно, спасибо за это. Похоже, я буду использовать библиотеку ICU для получения ординалов, но я не знаю, как они с этим справятся. Я проверю это. - person Roel; 30.09.2008
comment
@Roel: Это el segundo día / la segunda mano, и они разные, даже если не до конца прописаны: el 2º día / la 2ª mano - person MikMik; 10.09.2012

Я потратил довольно много времени на изучение этого вопроса, потому что это слишком большой проект, чтобы я мог его исправить. Похоже, что библиотека ICU - единственная, которая предоставляет эту функциональность в некоторой степени исчерпывающим образом (http://www.icu-project.org/apiref/icu4c/classRuleBasedNumberFormat.html). Однако я не слишком заинтересован в создании такой огромной библиотеки. Я продолжу поиски и все еще открыт для предложений.

person Roel    schedule 26.09.2008

Вы искали репозиторий CLDR на сайте Unicode? Я не знаю, есть ли у них такие вещи, но, поскольку это, вероятно, самый полный репозиторий локальных данных, на него, вероятно, стоит взглянуть. http://www.unicode.org/cldr/

person Serge Wautier    schedule 02.10.2008
comment
Да, в CLDR есть порядковая информация, и ICU использует ее в качестве источника данных. Однако мне пришлось бы написать свой собственный код или разделить код, связанный с порядковым номером из ICU, в отдельную подбиблиотеку или около того. Оба не очень привлекательны. - person Roel; 02.10.2008

Поскольку вы используете C ++, я предполагаю, что вы можете использовать GNU gettext (есть также порт для Windows) для всех переводов или, по крайней мере, понять, как они это решили. Вот соответствующая страница руководства во множественном числе, которая объясняет проблему (которую вы уже нашли, но более подробно) и ее решение:

http://www.gnu.org/software/automake/manual/gettext/Plural-forms.html < / а>

person Milan Babuškov    schedule 07.10.2008
comment
Единственная функциональность, которую я смог найти в gettext, - это множественное число, а не порядковые. Я мог бы создать собственное решение, используя что-то похожее на их подход, но я этого не хочу; Мне нужен доступ ко многим носителям языка. Я не настолько мотивирован :) Кроме того, gettext является GPL, что делает его непригодным для моего использования. - person Roel; 08.10.2008

Вот фрагмент кода CodeProject, который выполняет эту работу. Сам не пробовал.

person Sergey Kornilov    schedule 26.09.2008