PHP-Intl对PHP V7.0.20的作用不同

时间:2017-06-14 11:16:45

标签: php phpunit intl

我有以下代码:

$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 333phpunit output

知道什么是新的或为什么?

1 个答案:

答案 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

但请记住,这也会隐藏您可能已针对错误内容进行测试的潜在问题。因此,最好将失败的测试作为一个注释,让自己了解您的期望,以及代码是否符合您所编写的内容。