使用numberFormatter格式化货币

7

我在使用php NumberFormatter类时遇到了一些问题。我希望显示四舍五入的数字,没有小数,并且带有小数的数字要保留2位小数。例如:

$fmt = new NumberFormatter('nl', NumberFormatter::CURRENCY);
$fmt->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0);
$fmt->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2);

var_dump($fmt->formatCurrency(15.15, 'EUR')); //Outputs € 15,15
var_dump($fmt->formatCurrency(15, 'EUR')); //Outputs € 15,00

如您所见,最后一个转储输出的是15,00,但我在这里预期的是15。 每当我使用“完整”语言环境nl_NL而不是nl时,格式化程序会按预期运行,但我无法使用它,因为我只有我的语言环境可用。
$fmt = new NumberFormatter('nl_NL', NumberFormatter::CURRENCY);
$fmt->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 0);
$fmt->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2);

var_dump($fmt->formatCurrency(15.15, 'EUR')); //Outputs € 15,15
var_dump($fmt->formatCurrency(15, 'EUR')); //Output € 15

这似乎是NumberFormatter中的错误,但我真的不知道如何修复它或找到其他解决方法。如果有帮助,我会非常感激。


肯定看起来像是一个 bug。如果确实是这样的话,修复方法不是使用 NumberFormatter,而是创建自己的格式化器。为了快速解决问题,您可以查询字符串末尾的格式化货币是否为 ",00",如果是,则将其删除。 - Frederik Krautwald
谢谢您的评论。编写自己的代码并不是一个好的选择,因为我们的网站有很多语言。如果没有更好的解决方案,我可以实现一个“脏”修复方法。 - Bram Gerritsen
2个回答

1

您可以使用MAX_SIGNIFICANT_DIGITS属性:

$fmt = new NumberFormatter('nl', NumberFormatter::CURRENCY);
$fmt->setAttribute(\NumberFormatter::MAX_SIGNIFICANT_DIGITS, 7);

var_dump($fmt->formatCurrency(15.15, 'EUR')); // Outputs € 15,15
var_dump($fmt->formatCurrency(15, 'EUR'));    // Outputs € 15

1
我不知道为什么这个“脏修复”被标记为正确答案,对我来说,这个方法有效,但我将MAX_SIGNIFICANT_DIGITS设置为100 - Zoe Edwards

0

临时解决方案:

$formattedCurrency = preg_replace('/,00$/', '', $fmt->formatCurrency(15, 'EUR'));

2
谢谢。顺便说一下,应该是/[,\.]00$/,因为英语中使用的是点。15.00 - Bram Gerritsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接