【问题标题】:Have I found a bug in PHP's NumberFormatter's "formatCurrency" function?我是否在 PHP 的 NumberFormatter 的“formatCurrency”函数中发现了一个错误?
【发布时间】:2020-05-08 12:40:26
【问题描述】:

我碰巧知道“SEK”(瑞典货币)货币应该如何在“SE”(瑞典)语言环境中以“sv”(瑞典)语言格式化。它应该使用数千个分隔符的句点。但是,下面的最小代码示例将显示 PHP 以空格而不是千位分隔符的句点输出它。它确实得到正确的逗号(用于十进制字符)以及最后的“kr”,所以我不知道该怎么做:

// 代码示例 #1(正常工作):

$a = new \NumberFormatter('en_US', \NumberFormatter::CURRENCY);
var_dump($a->formatCurrency(123456789.987, 'USD'));

Expected output:

    $123,456,789.99

Actual output:

    $123,456,789.99

// 代码示例 #2(似乎无法正常工作):

$a = new \NumberFormatter('sv_SE', \NumberFormatter::CURRENCY);
var_dump($a->formatCurrency(123456789.987, 'SEK'));

Expected output:

    123.456.789,99 kr

Actual output:

    123 456 789,99 kr

这可能有什么原因?令人沮丧的是它“几乎”做对了。

【问题讨论】:

  • 这个错误报告和你的bugs.php.net/bug.php?id=75371一样吗?
  • 向我们办公室的常驻瑞典人询问 - 她同意 PHP 在瑞典的货币格式(即千位分隔符的空格)......就像宜家一样。您的格式看起来像在欧洲大陆(NL/DE/FR...)而不是瑞典使用的格式...
  • @vivek_23 好吧,我没有归档,但似乎相关。
  • @CD001 我应该提到的是,在瑞典,非货币数字被格式化为 PHP 格式,但货币总和使用千位分隔符的句点。
  • 只需在产生的数字中使用带有点的空格str_replace()

标签: php number-formatting numberformatter format-currency


【解决方案1】:

这行得通,但它是一个黑客:

$a = new \NumberFormatter('sv_SE', \NumberFormatter::CURRENCY);
$a->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '.'); 
$a->setPattern('#,##0.## kr');
var_dump($a->formatCurrency(123456789.987, 'SEK'));

输出:

string(17) "123.456.789,99 kr" 

【讨论】:

  • 谢谢,我可能会使用它,但它仍然给我一种唠叨的感觉,如果这是错误的,还有什么是错误的,我永远不会知道,因为我没有专门的知识任何其他语言/地区/货币组合?这才是我真正担心的!
  • @user12760574 根据sv.wikipedia.org/wiki/Tusentalsavgr%C3%A4nsare 的说法,瑞典建议使用该空间,也可用于货币。所以,基于此,无需担心......
  • @JanP 嗯。那么,“推荐”是什么意思?我喜欢正确地做事,而不是流行的事情。
猜你喜欢
  • 2015-10-02
  • 2011-02-11
  • 1970-01-01
  • 2012-03-21
  • 2013-10-27
  • 1970-01-01
  • 2012-08-20
  • 2011-04-01
  • 1970-01-01
相关资源
最近更新 更多