Откуда PHP NumberFormatter берет форматы локали?

Где же NumberFormatter в PHP взять форматы локали от? Больше интересует среда Linux, если это что-то меняет.

Он скомпилирован или используется какой-то системный ресурс? Как я могу просмотреть форматы для каждой поддерживаемой локали? (locale -c -k LC_MONETARY кажется, не перечисляет / не имеет информации о шаблоне.) Являются ли они модифицируемыми для каждого сервера?

Если в формате есть ошибка, где я могу сообщить об этом или предложить исправление? (Например, lv_LV локаль имеет ошибку в отношении тысячи разделителей.)

Почему выходные данные отличаются для HHVM — https://3v4l.org/ms1ZN ?

1

Решение

Не легко ответить, если это не задокументировано в официальных документах. Однако давайте посмотрим на NumberFormatter реализация PHP: https://github.com/php/php-src/tree/8939c4d96b8382abe84f35e69f4f6ebd6f0f749d/ext/intl/formatter

Если вы хорошо владеете Си, вы можете найти правильное место, которое я не нашел сразу (если один из нас действительно заменит эту часть ответа).

Однако, насколько я понимаю код, правильные форматы извлекаются из международный пакет (= пакет интернационализации, http://php.net/manual/de/book.intl.php). NumberFormatter Сам является частью этого.

Если вы обнаружили реальную ошибку, вы можете предложить исправление на официальном сайте отчетов об ошибках PHP относительно пакета intl (https://bugs.php.net/).

1

Другие решения

PHP использует библиотеку ICU (см. Функцию unum_formatDoubleCurrency в внутр / междунар / форматировщик / formatter_format.c).

Библиотека ICU, в свою очередь, использует Common Locale Data Repository (CLDR) (см. http://userguide.icu-project.org/icudata).

Формат в примере (формат валюты для lv_LV локали), можно увидеть в Инструменте опроса CLDR — http://st.unicode.org/cldr-apps/v#/lv/Number_Formatting_Patterns/

Если бы была ошибка, об этом можно было бы сообщить в http://unicode.org/cldr/trac/newticket или отредактировано в Survey Tool с помощью учетной записи, приобретенной в этой контактной форме: http://www.unicode.org/reporting.html

Но в текущем случае ошибки не было.

Формат PHP не соответствует данным CLDR, вероятно, из-за libicu версия (и ее версия CLDR), установленная на конкретном компьютере / сервере, или используемый файл данных (icudatl.dat, увидеть http://userguide.icu-project.org/icudata). На данный момент (2018-09), последний libicu/ версия данных 62 (см. http://site.icu-project.org/home) и последняя версия CLDR — 34 (см. http://cldr.unicode.org/).

Если icu-devtools установлен, работает icuinfo будет отображать то, что libicu а также CLDR версии используются. В моем случае: <param name="version">55.1</param>[..]<param name="cldr.version">27.0.1</param>

Существует два варианта формата валюты в lv_LVHHVM, очевидно, использует другой, по некоторым причинам.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector