PHP NumberFormatter, formatCurrency 方法舍入塞尔维亚第纳尔数

问题描述 投票:0回答:1

PHP NumberFormatter、formatCurrency 方法对塞尔维亚第纳尔的数字进行舍入,但它适用于其他地区和货币,例如波兰、俄罗斯和土耳其。

echo (new NumberFormatter('sr_RS',NumberFormatter::CURRENCY))
        ->formatCurrency('127.43','RSD');
// 127 дин.

echo (new NumberFormatter('ro_RO',NumberFormatter::CURRENCY))
        ->formatCurrency('127.43','RON');
// 127,43 RON

echo (new NumberFormatter('pl_PL',NumberFormatter::CURRENCY))
        ->formatCurrency('127.43','PLN');
//127,43 zł

echo (new NumberFormatter('tr_TR',NumberFormatter::CURRENCY))
        ->formatCurrency('127.43','TRY');
//127,43 ₺

所以我也想在第一种情况下显示小数,这是正常行为吗?

php rounding numberformatter format-currency
1个回答
1
投票

塞尔维亚的默认货币数字格式不包括小数位 - 可能在该地区不经常使用或忽略小数位。

您可以在 NumberFormatter Patterns 标题和 CURRENCY 副标题下看到此 ICU 数据表 中使用的模式。如果您在顶部的搜索框中输入其他语言环境,您会注意到大多数使用

#,##0.00
的格式,而
sr_RS
语言环境使用
#,##0
.

虽然可能是不好的做法,因为 ICU 模式通常是大多数人对每个语言环境的期望,但您可以通过使用正则表达式:

$nf = new NumberFormatter('sr_RS', NumberFormatter::CURRENCY);
$nf->setPattern(preg_replace('/##0(?!\.)/', '##0.00', $nf->getPattern()));
echo $nf->formatCurrency('127.43','RSD');
// 127,43 RSD

模式

##0(?!\.)
表示要查找以两个井号标签/井号开头,后跟一个没有句点的零的字符串,并将其替换为包含 2 个小数位 (
##0.00
) 的模式。

© www.soinside.com 2019 - 2024. All rights reserved.