如何结合PHP NumberFormatter的PADDING_POSITION与CURRENCY实现紧凑货币格式化?
如何在PHP中实现带货币的紧凑数字格式化
目标效果(JavaScript实现)
我想要实现和JavaScript中以下代码相同的格式化效果:
Intl.NumberFormat('en-CA', {style: 'currency', currency: 'CAD', notation: 'compact', maximumSignificantDigits: 5 }).format(12345000000); // 输出: $12.345B Intl.NumberFormat('fr-CA', {style: 'currency', currency: 'CAD', notation: 'compact', maximumSignificantDigits: 5 }).format(12345000000); // 输出: "12,345 G$"
已实现的单独功能
紧凑数字格式
我可以通过以下方式实现紧凑格式,但不带货币符号:
$formatter = new NumberFormatter('en_CA', NumberFormatter::PADDING_POSITION); $formatter->setAttribute(NumberFormatter::SIGNIFICANT_DIGITS_USED, 5); echo $formatter->format(12345000000); // 输出: 12.345B $formatter = new NumberFormatter('fr_CA', NumberFormatter::PADDING_POSITION); $formatter->setAttribute(NumberFormatter::SIGNIFICANT_DIGITS_USED, 5); echo $formatter->format(12345000000); // 输出: 12,345 G
货币格式化
也可以实现完整的货币格式化,但没有紧凑显示:
$formatter = new NumberFormatter('en_CA', NumberFormatter::CURRENCY); echo $formatter->formatCurrency(12345000000, 'CAD'); // 输出: $12,345,000,000.00 $formatter = new NumberFormatter('fr_CA', NumberFormatter::CURRENCY); echo $formatter->formatCurrency(12345000000, 'CAD'); // 输出: 12 345 000 000,00 $
结合尝试失败的情况
当我尝试将两者结合时,货币符号无法显示:
$formatter = new NumberFormatter('en_CA', NumberFormatter::PADDING_POSITION); $formatter->setAttribute(NumberFormatter::SIGNIFICANT_DIGITS_USED, 5); echo $formatter->formatCurrency(12345000000, 'CAD'); // 输出: 12.345B $formatter = new NumberFormatter('fr_CA', NumberFormatter::PADDING_POSITION); $formatter->setAttribute(NumberFormatter::SIGNIFICANT_DIGITS_USED, 5); echo $formatter->formatCurrency(12345000000, 'CAD'); // 输出: 12,345 G
问题
PHP官方文档中NumberFormatter的说明十分简略,想请教这个需求是无法通过内置的国际化方法实现,还是有其他技巧可以达成?我知道可以自定义解决方案,但更希望像JavaScript那样依赖内置方法实现。
内容的提问来源于stack exchange,提问作者dave
相关产品推荐
相关产品推荐

