PHP的NumberFormatter从何处获取语言环境格式?

时间:2018-09-06 15:13:09

标签: php locale currency

PHP's NumberFormatter从何处获取语言环境格式?如果有什么不同,对Linux环境更感兴趣。

是在其中编译,还是使用了某些系统资源?如何查看每个支持的语言环境的格式? (locale -c -k LC_MONETARY似乎没有列出/没有有关模式的信息。)它们是否可以在每个服务器上修改?

如果格式有误,我该在哪里报告或提出解决方案? (例如,lv_LV语言环境在千位分隔符方面有误。)

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

2 个答案:

答案 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-devtoolsicuinfo版本。就我而言:libicu

CLDR中为货币格式提供了两种选择,出于某种原因,HHVM显然使用了另一种。