您在此处看到的区域设置 de-AT 的差异:
3.333
and
3 333
只是单纯的字符串比较,是有区别的。
对于书面语言来说,没有。两种形式在该区域设置中都是正确的,并显示same number.
但是,您希望更明确地进行配置,为此,命令数字格式化程序使用点“.”。作为千位分隔符(而不是使用编译的语言环境信息):
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '.');
配置数据
根本原因是实际代码旁边的 PHP intl 扩展附带了语言数据(来自 CLDR 项目),其中包含符号和规则形式的格式化信息。这意味着,即使扩展版本相同,格式也可能会改变(正如您在 Phpunit 测试中发现的那样)。衍生的从你的例子来看 https://3v4l.org/3R1VA:
导致空格而不是点的行是:
http://unicode.org/cldr/trac/browser/trunk/common/main/de_AT.xml#L120 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 http://unicode.org/cldr/trac/changeset/11798/trunk/common/main/de_AT.xml
以前,数字组符号是从具有点的父语言环境中接管的。
这是在 Changeset 11798 Timestamp: 07/13/15 12:38:02 (2 年前) - 发布需要时间,所以这就是为什么你只在库的后续版本中看到它。
我只能强调一点,这是配置数据。
处理(单元)测试中的配置
在单元测试中,您通常不想对此进行测试。在配置测试中,您可能想要对此进行测试。您的 Phpunit 测试确实表明您到目前为止的期望不再符合。因此,这可能需要更改代码(即使您的配置期望再次起作用)或更改测试,因为您正在测试特定于区域设置的配置,您可能不是您想要的。
从你的问题我可以想象两者都是可能的。最后,测试反映了您的期望,并且可能揭示了隐藏的依赖关系,这里是区域设置配置数据。
修复方法只需将语言环境切换为“de
“ 代替 ”de-AT
": https://3v4l.org/hB15n https://3v4l.org/hB15n
但请记住,这也会隐藏您可能测试错误的潜在问题。因此,最好将失败的测试作为记录,询问自己的期望以及代码是否符合您编写的目的。