我有以下代码:
$lang="de-AT";
$currency="3333";
$formatter = new NumberFormatter($lang, NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, 2);
echo $formatter->format($currency);
可以在这里运行复制/粘贴:online php(虽然我不知道这个网站的php版本)
输出:3.333
,这正是我所期望的。
但是在我的本地主机上使用PHP 7.0.20和PHPUnit 6.2.1,单元测试结果为:3 333
。
知道什么是新的或为什么?
答案 0 :(得分:2)
您在这里看到的locales de-AT的区别:
3.333
和
3 333
只是通过裸字符串比较,存在差异。
对于书面语言,没有。这两种形式在该语言环境中都是正确的,并显示相同的号码。
但是,您希望更明确地配置,为此,命令number-formatter使用点'。'作为千位分隔符(而不是使用已编译的语言环境信息):
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '.');
根本原因是实际代码旁边的PHP intl扩展附带了语言数据(来自CLDR项目),其中包含符号和规则形式的格式信息。这意味着,即使扩展版本相同,格式也可以更改(正如您在Phpunit测试中发现的那样)。派生from your example:
hhvm-3.15.4的输出 - 3.19.0,7.2.0alpha1
3.333 1.1.0
5.6.0 - 5.6.30,7.0.0 - 7.1.6
的输出3 333 1.1.0
引起空格而不是点的线是:
http://unicode.org/cldr/trac/browser/trunk/common/main/de_AT.xml#L120(@ 13494)
具体变化:
http://unicode.org/cldr/trac/changeset/11798/trunk/common/main/de_AT.xml
以前,数字组符号是从具有点的父语言环境中接管的。
那是在Changeset 11798时间戳:07/13/15 12:38:02(2年前) - 发布需要时间,所以这就是为什么你只能在库的后期版本中看到这一点。
我只能强调这是配置数据。
在单元测试中,您通常不想测试它。在配置测试中,您可能想要测试它。你的Phpunit测试确实表明你到目前为止的期望不再匹配。因此,这可能需要更改代码(即使配置期望再次起作用)或测试中的更改,因为您正在测试特定于语言环境的配置,而这可能是您未查找的内容。
从你的问题我可以想象两者都是可能的。最后,测试反映了您的期望,并且可能揭示了隐藏的依赖关系,这里是语言环境配置数据。
修复可能与将语言环境切换为“de
”而非“de-AT
”一样少:https://3v4l.org/hB15n
输出为5.6.0 - 5.6.30,hhvm-3.15.4 - 3.19.0,7.0.0 - 7.2.0alpha1
3.333 1.1.0
但请记住,这也会隐藏您可能已针对错误内容进行测试的潜在问题。因此,最好将失败的测试作为一个注释,让自己了解您的期望,以及代码是否符合您所编写的内容。