Php NumberFormatter::formatCurrency()忽略最小分数数字

Php NumberFormatter::formatCurrency()忽略最小分数数字,php,intl,Php,Intl,我想使用PHP的Intl的NumberFormatter类以人类可读的格式显示价格。我们的项目需要: CLDR编号模式、货币和分隔符符号需要通过我们的代码进行配置,而不是Intl/ICU知道的默认值 我们的应用程序将处理小数。NumberFormatter应该显示我们传递给它的任何小数 然而,当我尝试使用不同的配置来找到适合我们项目的精确组合时,我注意到了一些我无法解释的效果。下面代码段中的三个格式化程序几乎相同。与第一种货币不同,第二种货币使用欧元而不是美元,第三种货币设置了货币符号。第一

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

  • CLDR编号模式、货币和分隔符符号需要通过我们的代码进行配置,而不是Intl/ICU知道的默认值
  • 我们的应用程序将处理小数。NumberFormatter应该显示我们传递给它的任何小数
然而,当我尝试使用不同的配置来找到适合我们项目的精确组合时,我注意到了一些我无法解释的效果。下面代码段中的三个格式化程序几乎相同。与第一种货币不同,第二种货币使用欧元而不是美元,第三种货币设置了货币符号。第一个格式化程序的输出与我预期的一样,但当我更改货币或设置货币符号时,将忽略“最小分数”数字属性,并且符号从未更改

<?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 €
?>

的General Purpose Number下的第一行表描述了在解析货币模式时,模式小数部分的两个0需要被应用程序认为合适的数字替换。这里的应用程序是ICU(PHP为此使用的C库),MIN_FRACTION_DIGITS属性的作用是让我覆盖第一个示例中的默认行为,而不是第二个或第三个示例中的默认行为


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

我刚刚发现以下信息:

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

我确认这是4.4.x分支中的ICU错误。
考虑升级LIbCU,4.8 .X给出正确的结果< /P>
在我发布这个问题一分钟后,我无意中发现了这个问题,听起来和我遇到的问题完全一样,但这仍然不能解释为什么在ICU设置了这个限制。如果你想使用
en_US
de_de
USD
打印价格,它仍然不起作用。以及
最大分数位数
分数位数