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_INlocale的NumberFormatter会根据数值精度自动省略末尾零,需手动强制指定小数位数。
内容的提问来源于stack exchange,提问作者Nandha
相关产品推荐
相关产品推荐

