PHP NumberFormatter在bg_BG区域下USD显示缩写而非符号的解决方法
解决PHP NumberFormatter在bg_BG区域下仅强制USD显示$符号的问题
问题核心在于NumberFormatter依赖ICU库的区域数据,bg_BG区域下USD的默认格式仍沿用了旧的缩写щ.д.,而直接全局设置CURRENCY_SYMBOL会覆盖所有货币的符号(包括本国货币BGN),因此需要针对性处理USD的格式化逻辑。
以下是两种可行的自定义修复方案:
方案一:临时切换符号再恢复
针对USD单独修改符号,完成格式化后立即恢复原符号,避免影响其他货币:
$curr = new NumberFormatter('bg_BG', NumberFormatter::CURRENCY); $amount = 16.32; $currency = 'USD'; $formatted = ''; if ($currency === 'USD') { // 保存当前区域的默认货币符号(即BGN的л.в.) $originalSymbol = $curr->getSymbol(\NumberFormatter::CURRENCY_SYMBOL); // 临时将符号设置为$ $curr->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, '$'); $formatted = $curr->formatCurrency($amount, $currency); // 恢复原符号,确保后续格式化其他货币不受影响 $curr->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, $originalSymbol); } else { $formatted = $curr->formatCurrency($amount, $currency); } echo $formatted; // USD输出16,32 $;EUR输出49,47 €;BGN输出对应л.в.格式
方案二:自定义格式模式
通过修改格式模式,将USD的占位符替换为$,同样仅针对USD生效:
$curr = new NumberFormatter('bg_BG', NumberFormatter::CURRENCY); $amount = 16.32; $currency = 'USD'; $formatted = ''; if ($currency === 'USD') { // 获取当前区域的默认货币格式模式(通常为#,##0.00 ¤) $originalPattern = $curr->getPattern(); // 将模式中的货币占位符¤替换为$ $curr->setPattern(str_replace('¤', '$', $originalPattern)); $formatted = $curr->formatCurrency($amount, $currency); // 恢复原模式,不影响其他货币 $curr->setPattern($originalPattern); } else { $formatted = $curr->formatCurrency($amount, $currency); } echo $formatted;
两种方案都能保证仅USD显示$符号,其他货币(如EUR、BGN)的格式不受影响,符合需求。
内容的提问来源于stack exchange,提问作者cheeseus
相关产品推荐
相关产品推荐

