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.
取以下代码:
$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.