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

PHP中按印度数字格式显示货币并保留小数点后末尾零

印度数字格式格式化并保留末尾零

方案一:正则拆分处理(精准保留原小数位)

核心思路是将数值拆分为整数和小数部分,单独处理整数的印度分组格式,再原样拼接小数部分,确保末尾零不丢失:

$num = '150000.50';

// 拆分整数与小数部分
list($integer, $decimal) = explode('.', $num, 2);

// 处理整数部分为印度分组格式
if (strlen($integer) > 3) {
    $lastThreeDigits = substr($integer, -3);
    $prefixDigits = substr($integer, 0, -3);
    // 反转前缀数字,按每两位加逗号后再反转回来
    $reversedPrefix = strrev($prefixDigits);
    $formattedPrefix = preg_replace('/(\d{2})(?=\d)/', '$1,', $reversedPrefix);
    $formattedInteger = strrev($formattedPrefix) . ',' . $lastThreeDigits;
} else {
    $formattedInteger = $integer;
}

// 拼接结果,保留原小数位
$formattedNum = $formattedInteger . '.' . $decimal;

echo $formattedNum; // 输出:1,50,000.50

正则说明

/(\d{2})(?=\d)/ 针对反转后的前缀数字,匹配每两位数字且后面仍有数字的位置,插入逗号,契合印度格式从右往左先三位、再每两位的分组规则。


方案二:Intl扩展优化(保留指定小数位)

如果偏好使用NumberFormatter,可通过设置小数位的最小/最大值,强制保留原有的小数位数:

$num = '150000.50';
// 获取原数值的小数位数
$decimalCount = strlen(explode('.', $num)[1]);

$formatter = new NumberFormatter('en_IN', NumberFormatter::DECIMAL);
// 强制保留指定数量的小数位
$formatter->setAttribute(NumberFormatter::MIN_FRACTION_DIGITS, $decimalCount);
$formatter->setAttribute(NumberFormatter::MAX_FRACTION_DIGITS, $decimalCount);

echo $formatter->format((float)$num); // 输出:1,50,000.50

为什么之前的方法失效?

  • 原正则仅处理整数部分,未单独保留小数部分,导致末尾零被隐式忽略;
  • 默认的en_IN locale的NumberFormatter会根据数值精度自动省略末尾零,需手动强制指定小数位数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:22:04