NumberFormatter::formatCurrency() 在不同平台上的输出

NumberFormatter::formatCurrency() output on different platforms

取以下代码:

$formatter = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
echo $formatter->formatCurrency('-1.23', 'EUR');

在 Fedora 25 上,输出是 -1,23 €,这是我期望的输出。

但是在 CentOS 7 上,输出是 (1,23 €);对法国观众来说不是很明确。

这些差异从何而来?我怀疑它们来自系统上安装的libicu版本,但我需要对此进行确认。另外我不确定 PHP 使用的是系统上安装的 ICU 版本,还是编译时捆绑的版本。

CentOS 7 有 libicu-50.1.2-15,Fedora 25 有 libicu-57.1-4,但是 PHP 两个系统上的版本相同,所有软件包都来自同一个存储库(remi),所以如果 ICU 与 PHP 捆绑在一起,我希望它们的版本相同。

PHP "remi" 存储库(以及 AFAIK 所有第 3 方存储库)使用系统 libicu,因为 PHP.

中没有捆绑的 libicu

(EL-6 的 remi 存储库中使用 libicu 50 的软件包中的唯一例外,从 EL-7 而不是默认的 4.2 向后移植)

可能的解决方法,设置输出模式:

$formatter = new NumberFormatter('fr_FR', NumberFormatter::CURRENCY);
$p = $formatter->getPattern(); // "#,##0.00 ¤;(#,##0.00 ¤)"
$p = explode(";", $p, 2);
$formatter->setPattern($p[0]); // "#,##0.00 ¤"
echo $formatter->formatCurrency('-1.23', 'EUR');

在 Fedora 25 (icu 58) 和 RHEL-7 (icu 50) 上测试:

来自ICU Documentation - Decimal Format - Detailed description

If there is no explicit negative subpattern, the negative subpattern is the localized minus sign prefixed to the positive subpattern.