为什么PHP的NumberFormatter以四舍五入的格式格式化瑞士法郎金额?

时间:2019-02-11 20:38:31

标签: php currency icu intl

formatCurrency()类使用NumberFormatter方法和瑞士法郎的货币对我来说,四舍五入到最接近的镍金额(0.05)。

代码:

$formatter = new \NumberFormatter('en_US', \NumberFormatter::CURRENCY);
echo $formatter->formatCurrency('12.34', 'CHF');

结果:

  

CHF12.35

请注意,数字量12.34会四舍五入为12.35。起初,我认为这可能是预料之中的,这是一种我不熟悉的处理资金的新方式。事实证明,这不是应该的工作方式。 (https://money.stackexchange.com/q/105014/81599

为什么它会四舍五入到PHP中最接近的镍含量,我该如何解决?

1 个答案:

答案 0 :(得分:1)

答案实际上在PHP之外,在ICU library内,PHP通过Internationalization extension包装。事实证明,我有一个过时的ICU库版本(50.x),其中包含镍四舍五入的bug。更新到最近的ICU库(截至今天,63.1)将使您能够使用最新的国际化标准,包括此错误修复程序。我不确定ICU的哪个特定升级解决了我的问题,但是我知道最新的解决方法可以解决此问题。

首先为什么会发生这种情况,瑞士淘汰了本币种的0.01面额,而最低面额实际上是现金量的0.05面额。可能,从事ICU工作的开发人员会因为阅读this Unicode chart而感到困惑,例如,起初可能会产生误导。

相关: