NumberFormatter::formatCurrency() ignores MIN_FRACTION_DIGIT


NumberFormatter::formatCurrency() ignores MIN_FRACTION_DIGITS

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

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

但是,当尝试不同的配置以找到适合我们项目的确切组合时,我注意到一些我无法解释的效果。以下代码段中的三个格式化程序几乎相同。与第一个相反,第二个使用欧元而不是美元,第三个设置了货币符号。第一个格式化程序的输出与我预期的那样,但是当我更改货币或设置货币符号时,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 编号模式文档的通用数字下的第一个表行描述了在解析货币模式时,模式小数部分中的两个零需要替换为应用程序认为合适的数字数。这里的应用程序是 ICU(PHP 为此使用的 C 库),MIN_FRACTION_DIGITS 属性的作用是让我覆盖第一个示例中的默认行为,但在第二个或第三个示例中则不然。

有人可以解释一下这种看似随机的行为变化吗?如果您需要任何其他信息,请告诉我。

我刚刚找到了以下内容:

  • https://bugs.php.net/bug.php?id=63140
  • http://bugs.icu-project.org/trac/ticket/7667

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

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