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

如何用NumberFormatter实现货币小数的条件格式化?

瑞士法郎(CHF)条件格式化实现方案

针对你提出的CHF货币格式化需求——整数金额(如1'200.00)显示为CHF 1'200.-,带小数的金额补全两位小数(如1'200.2转为1'200.20、1'200.20保持不变),PHP的NumberFormatter没有直接对应的属性配置,需要通过先标准格式化再自定义字符串处理的方式实现,具体方案如下:

核心实现思路

  1. 用NumberFormatter按瑞士德语区(de_CH)的货币规则格式化数字,强制保留两位小数;
  2. 对格式化后的结果做判断:如果小数部分是.00,则替换为.-;否则保留原格式。

代码示例

// 初始化符合瑞士格式的货币格式化器
$formatter = new \NumberFormatter('de_CH', \NumberFormatter::CURRENCY);
$formatter->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, 2);
$formatter->setAttribute(\NumberFormatter::MAX_FRACTION_DIGITS, 2);

// 自定义CHF格式化函数
function formatCHFCurrency(\NumberFormatter $formatter, float $amount, string $currency = 'CHF'): string {
    $standardFormatted = $formatter->formatCurrency($amount, $currency);
    // 替换.00结尾的格式为.-
    if (substr($standardFormatted, -3) === '.00') {
        return substr($standardFormatted, 0, -3) . '.-';
    }
    return $standardFormatted;
}

// 测试用例
echo formatCHFCurrency($formatter, 1200.00); // 输出:CHF 1'200.-
echo formatCHFCurrency($formatter, 1200.2);  // 输出:CHF 1'200.20
echo formatCHFCurrency($formatter, 1200.20); // 输出:CHF 1'200.20

关于小数下标形式的实现

如果需要将小数部分设置为下标形式(仅适合HTML环境),可以在处理时拆分整数和小数部分,用<sub>标签包裹小数部分:

function formatCHFCurrencyWithSubscript(\NumberFormatter $formatter, float $amount, string $currency = 'CHF'): string {
    $standardFormatted = $formatter->formatCurrency($amount, $currency);
    if (substr($standardFormatted, -3) === '.00') {
        return substr($standardFormatted, 0, -3) . '.-';
    }
    // 拆分并包裹小数部分为下标
    [$integerPart, $decimalPart] = explode('.', $standardFormatted);
    return "{$integerPart}.<sub>{$decimalPart}</sub>";
}

内容的提问来源于stack exchange,提问作者GrayhoundButPurple

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 11:52:56