NumberFormatter :: formatCurrency()忽略MIN_FRACTION_DIGITS

时间:2013-10-18 09:11:46

标签: php intl

我想使用PHP的Intl的NumberFormatter类以人类可读的格式显示价格。我们的项目需要什么:

  • CLDR数字模式,货币和分隔符号需要通过我们的代码进行配置,而不是默认为Intl / ICU知道的内容。
  • 我们的应用程序将处理小数。 NumberFormatter应显示我们传递给它的任何小数。

但是,在使用不同的配置来寻找适合我们项目的确切组合时,我注意到一些我无法解释的效果。以下代码段中的三个格式化程序几乎相同。与第一个相反,第二个使用欧元而不是美元,第三个使用货币符号集。第一个格式化程序的输出正如我预期的那样,但是当我更改货币或设置货币符号时,将忽略MIN_FRACTION_DIGITS属性并且永远不会更改符号。

<?php
$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
$fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 4);
echo $fmt->formatCurrency(1234567890.891234567890000, "EUR")."\n";
// Outputs 1.234.567.890,8912 €

$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
$fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 4);
echo $fmt->formatCurrency(1234567890.891234567890000, "USD")."\n";
// Ouputs 1.234.567.890,89 $

$fmt = new NumberFormatter('de_DE', NumberFormatter::CURRENCY);
$fmt->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, 4);
$fmt->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, '%');
echo $fmt->formatCurrency(1234567890.891234567890000, "EUR")."\n";
// Outputs 1.234.567.890,89 €
?>

Unicode CLDR number pattern documentation通用编号下的第一个表行描述了在解析货币模式时,模式的小数部分中的两个零将需要替换为多个零应用程序认为合适的数字。这里的应用程序是ICU(PHP用于此目的的C库),MIN_FRACTION_DIGITS属性的作用是让我在第一个示例中覆盖默认行为,但不在第二个或第三个示例中。

有人可以解释这种看似随意的行为变化吗?如果您需要任何其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我刚刚发现以下内容:

  

[2012-10-05 08:21 UTC] jpauli @ email.com

     

我确认这是4.4.x分支中的ICU错误   考虑升级libicu,4.8.x给出正确的结果