You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 17:56:19