PHP的NumberFormatter从哪里获取语言环境格式?

问题描述 投票:1回答:2

PHP's NumberFormatter从哪里获取语言环境格式?对Linux环境更感兴趣,如果这有任何区别。

是编译进来还是使用了一些系统资源?如何查看每个受支持的区域设置的格式? (locale -c -k LC_MONETARY似乎没有列出/有关于模式的信息。)它们是否可以在服务器上修改?

如果格式中存在错误,我可以在哪里报告或提出修复? (例如,lv_LV语言环境有关千分隔符的错误。)

为什么HHVM的输出不同 - https://3v4l.org/ms1ZN

php locale currency
2个回答
1
投票

如果没有在官方文档中记录,则不容易回答。但是,让我们来看看PHP的NumberFormatter实现:https://github.com/php/php-src/tree/8939c4d96b8382abe84f35e69f4f6ebd6f0f749d/ext/intl/formatter

如果你擅长C,你可能会找到我没有立即找到的正确位置(如果我们其中一个人让我们替换这部分答案)。

但是据我了解代码,从intl包(= internationalization package,http://php.net/manual/de/book.intl.php)中检索正确的格式。 NumberFormatter本身就是其中的一部分。

如果您发现真正的错误,可以在官方PHP Bug报告网站上提出有关intl包(https://bugs.php.net/)的修复方法。


1
投票

PHP使用ICU库(参见unum_formatDoubleCurrency中的函数ext/intl/formatter/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报告或通过此联系表格中获得的帐户在调查工具中进行编辑: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将显示正在使用的libicuCLDR版本。在我的情况下:<param name="version">55.1</param>[..]<param name="cldr.version">27.0.1</param>

lv_LV的货币格式有两种选择,HHVM由于某种原因显然使用了另一种货币格式。

© www.soinside.com 2019 - 2024. All rights reserved.