PHP's NumberFormatter从何处获取语言环境格式?如果有什么不同,对Linux环境更感兴趣。
是在其中编译,还是使用了某些系统资源?如何查看每个支持的语言环境的格式? (locale -c -k LC_MONETARY
似乎没有列出/没有有关模式的信息。)它们是否可以在每个服务器上修改?
如果格式有误,我该在哪里报告或提出解决方案? (例如,lv_LV
语言环境在千位分隔符方面有误。)
为什么HHVM的输出不同– https://3v4l.org/ms1ZN?
答案 0 :(得分:1)
如果官方文档中没有记录,则不容易回答。但是,让我们看看PHP的NumberFormatter
实现:https://github.com/php/php-src/tree/8939c4d96b8382abe84f35e69f4f6ebd6f0f749d/ext/intl/formatter
如果您的C语言不错,您可能会找到我没有立即找到的正确位置(如果我们中有人愿意,请替换答案的这一部分)。
据我所知,代码是从 intl程序包(=国际化程序包,http://php.net/manual/de/book.intl.php)中检索到正确的格式的。 NumberFormatter
本身就是其中的一部分。
万一发现真正的错误,可以在官方的PHP Bug报告站点上提出有关intl软件包(https://bugs.php.net/)的修复。
答案 1 :(得分:1)
PHP使用ICU库(请参见ext/intl/formatter/formatter_format.c中的函数private static void deserializePeers() {
try {
FileInputStream fis = new FileInputStream("peersList.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
peers = (LinkedHashMap<Integer, Peer>) ois.readObject();
ois.close();
fis.close();
} catch (Exception e) {
System.out.println("This is the first peer connected to the network"); }
}
)。
ICU库又使用通用语言环境数据存储库(CLDR)(请参阅http://userguide.icu-project.org/icudata)。
示例中的格式(unum_formatDoubleCurrency
语言环境的货币格式)可以在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数据不匹配,可能是由于特定计算机/服务器上安装的lv_LV
版本(及其CLDR版本)或正在使用的特定数据文件({{1} },请参阅http://userguide.icu-project.org/icudata)。目前(2018-09年),最新的libicu
/数据版本是62(请参阅http://site.icu-project.org/home),最新的CLDR版本是34(请参阅http://cldr.unicode.org/)。
如果安装了icudatl.dat
,则运行libicu
将显示正在使用的icu-devtools
和icuinfo
版本。就我而言:libicu
CLDR
中为货币格式提供了两种选择,出于某种原因,HHVM显然使用了另一种。