Где же NumberFormatter в PHP взять форматы локали от? Больше интересует среда Linux, если это что-то меняет.
Он скомпилирован или используется какой-то системный ресурс? Как я могу просмотреть форматы для каждой поддерживаемой локали? (locale -c -k LC_MONETARY
кажется, не перечисляет / не имеет информации о шаблоне.) Являются ли они модифицируемыми для каждого сервера?
Если в формате есть ошибка, где я могу сообщить об этом или предложить исправление? (Например, lv_LV
локаль имеет ошибку в отношении тысячи разделителей.)
Почему выходные данные отличаются для HHVM — https://3v4l.org/ms1ZN ?
Не легко ответить, если это не задокументировано в официальных документах. Однако давайте посмотрим на 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/).
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_LV
HHVM, очевидно, использует другой, по некоторым причинам.