NumberFormatter::SPELLOUT пропись-порядковый номер на русском и итальянском языках

этот код работает для английских, испанских и немецких порядковых номеров, но не работает с русскими или итальянскими порядковыми номерами.

'ru-RU','it-IT' тоже не работают

Я получаю, например, в русском языке для 2 -> два (это кардинальное число) , но я хочу порядковое число, и это будет здесь 2 -> второй.

Я получаю, например, по-итальянски 2 -> due (это кардинальное число), но мне нужен порядковый номер, и это будет здесь 2 -> secondo.

Обновление:

Я нашел решение с работами на французском, испанском, немецком и некоторых других языках:

мужские порядковые числительные: %spellout-ordinal-maskuline

женские порядковые числительные: %spellout-ordinal-feminine

русская и итальянская версии не работают, а я уже пробовал с -мужским/-женским родом

$ru_ordinal = new NumberFormatter('ru', NumberFormatter::SPELLOUT);
$ru_ordinal->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%spellout-ordinal");  

person Grischa    schedule 18.06.2014    source источник
comment
Для меня результат вызова format(42) (по порядку): сорок два, cuarenta y dos и quaranta due. Это ожидаемый результат? Убедитесь, что у вас установлен intl.   -  person Maerlyn    schedule 18.06.2014
comment
порядковое число для 42 называется сорок второй, по-испански cuadragésimo segundo, по-итальянски quarantaduesimo   -  person Grischa    schedule 19.06.2014
comment
да, я проверял, $ru_ordinal->format(42); возвращает сорок два вместо сорок второй. это странно   -  person user1978142    schedule 19.06.2014
comment
@user1978142 user1978142 У меня все отлично работает! Я думаю, вы не хотите, чтобы число было только порядковым номером, но число как дата, например: it's the second day, и вы не хотите: It's the two day, верно?   -  person Rizier123    schedule 10.01.2015
comment
@ Rizier123 Как он показывает порядковый номер? Я ищу решение только для порядковых номеров для русского и итальянского языков.   -  person Grischa    schedule 11.01.2015
comment
@Grischa Вам нужен порядковый номер, например: it's the second day на всех языках, или вы хотите, чтобы он был похож на it's the two day? Например, вы не хотите использовать только переведенный номер, вы хотели его с датой или что-то в этом роде?   -  person Rizier123    schedule 11.01.2015
comment
@ Rizier123 Мне нужен порядковый номер на русском и итальянском языках, в вашем примере это будет second. Я хочу перевести номер в одиночку!   -  person Grischa    schedule 11.01.2015
comment
@Grischa Да, это означает, например. вы НЕ хотите 2 -› два вы хотите: 2 -› второй правильно? и прямо сейчас вы получаете первый?   -  person Rizier123    schedule 11.01.2015
comment
@ Rizier123 Ризьер123 Точно по-итальянски я получаю 2 -> due вместо 2 -> secondo.   -  person Grischa    schedule 11.01.2015
comment
Давайте продолжим обсуждение в чате.   -  person Grischa    schedule 11.01.2015
comment
@Grischa Нет, я просто хотел прояснить, чего ты хочешь, теперь я понял: D Я думаю, ты должен добавить это к своему вопросу и показать, чего именно ты хочешь!   -  person Rizier123    schedule 11.01.2015


Ответы (2)


NumberFormatter использует форматирование ICU.

Как вы можете проверить здесь: http://saxonica.com/html/documentation/extensibility/config-extend/localizing/ICU-numbering-dates/ICU-numbering.html

... Русский (ru) имеет следующее форматирование:

  • произношение-кардинальный-женский (scf)
  • произношение-кардинальный-мужской род (скм)
  • произношение-кардинальный-средний (scne)
  • орфография-нумерация (sn)
  • пропись-нумерация-год (sny)

... и итальянский (it):

  • произношение-кардинальный-женский (scf)
  • произношение-кардинальный-мужской род (скм)
  • орфография-нумерация (sn)
  • пропись-нумерация-год (sny)
  • порядковый номер женского рода (мягкий)
  • порядковый номер мужского рода (сом)

Поэтому вы не сможете установить порядковый номер для (ru) и следующий код:

$nFormat = new NumberFormatter('it', NumberFormatter::SPELLOUT);
$nFormat->setTextAttribute(NumberFormatter::DEFAULT_RULESET, "%spellout-ordinal-feminine");

var_dump($nFormat->format(42));

Будет печатать:

string 'quaranta­duesima' (length=17)

Как вы (вероятно) хотите.

ИЗМЕНИТЬ:

Информация об используемом форматировании со ссылками на ICU: http://php.net/manual/en/numberformatter.create.php

Протестировано с PHP 5.4.x и версией ICU => 51.2; Версия данных ICU => 51.2. Вы можете использовать команду оболочки:

$ php -i | grep ICU

Чтобы проверить, какая у вас версия ICU.

Для последней версии ICU вам следует установить/обновить пакет php-intl: http://php.net/manual/en/intl.installation.php

РЕДАКТИРОВАТЬ 2:

Я создал расширение для NumberFormatter (пока с польскими порядковыми номерами). Не стесняйтесь добавлять другие языки: https://github.com/arius86/number-formatter

person Arius    schedule 10.01.2015
comment
Спасибо. К сожалению, мой хостер только недавно обновился до PHP 5.4 и ICU 4.4.1. Я проверил ваш код на phpfiddle.org и здесь я получаю кардинальное число вместо порядкового. - person Grischa; 11.01.2015
comment
Phpfiddle использует PHP 5.3.29. Я тестировал это на 5.4.12. Я добавил несколько дополнительных ссылок. Я думаю, что на этом тема заканчивается, и на самом деле другого ответа пока нет, поэтому я надеюсь, что вы отметите его как принятый. С наилучшими пожеланиями! - person Arius; 11.01.2015
comment
Еще раз спасибо, но я уже знаю дополнительные ссылки. Он также не работает на 5.4.36-1. Эта версия PHP используется на моем сайте. - person Grischa; 11.01.2015
comment
Вот, рабочий пример на моем сервере: private.arius.pl/test/ example.php?number=12 — вы можете изменить номер по своему усмотрению. Обновите локаль вашего сервера, чтобы иметь правильные значения для итальянского языка. - person Arius; 11.01.2015
comment
Можете ли вы показать мне код для example.php, такой как example.phps? Я не знаю, смогу ли я изменить локаль своего сервера. Я не использую свой собственный сервер. Работает ли ist с %spellout-ordinal-maskuline вместо %spellout-ordinal-feminine? - person Grischa; 11.01.2015
comment
По сути, это тот же код, который я вставил в ответ (только повторил и добавил вызов phpversion()). Я проверил большинство скриптов php, и, кроме одного, у них такая же проблема (вместо порядкового номера есть кардинальное). Так что, возможно, это довольно распространенная неправильная конфигурация для хостинговых услуг :( - person Arius; 11.01.2015
comment
Давайте продолжим обсуждение в чате. - person Grischa; 11.01.2015
comment
пропись-порядковый-мужской род для русского работает отлично. Но ошибся на украинском, есть идеи? ОИТ: 64,2 - person rodigy; 16.09.2020

Просто рекомендация, я не уверен, работает ли это или открыты ли службы Apache в данный момент, так как я учусь в колледже, но пробовали ли вы поставить ru-RU для России. В PHP я лично указал свои языковые коды как «en-GB».

http://download1.parallels.com/SiteBuilder/Windows/docs/3.2/en_US/sitebulder-3.2-win-sdk-localization-pack-creation-guide/30801.htm

Вот список, который я нашел в Интернете с некоторыми, чтобы помочь вам.

person user2558741    schedule 18.06.2014
comment
Спасибо, но я также пробовал ru-RU и fr-FR для французского, es-ES для испанского, it-IT для итальянского, работает только английский и немецкий. - person Grischa; 18.06.2014