金融、電商系統對金額顯示要求嚴格:千分位分隔、固定小數位、貨幣符號、負數紅色/括號顯示。本文提供一個健壯的 format_money 函數滿足常見需求。
<?php
/**
* 格式化金額
* @param float|int $money 金額 (分為單位傳入建議乘 100)
* @param int $len 小數位數,預設 2
* @param string $sign 貨幣符號,預設 '¥'
* @return string
*/
function format_money($money, $len = 2, $sign = '¥') {
$negative = $money < 0 ? '-' : '';
$absMoney = abs($money);
$len = max(0, (int)$len);
// 整數部分加千分位
$intPart = (string)(int)$absMoney;
$rev = strrev($intPart);
$chunks = str_split($rev, 3);
$formattedInt = strrev(implode(',', $chunks));
// 小數部分
$decimal = '';
if ($len > 0) {
$decimal = '.' . substr(sprintf('%01.' . $len . 'f', $absMoney), -$len);
}
return $sign . $negative . $formattedInt . $decimal;
}
// 使用範例
echo format_money(1234567.89) . PHP_EOL; // ¥1,234,567.89
echo format_money(-98765.5, 2, '$') . PHP_EOL; // $-98,765.50
echo format_money(1000, 0) . PHP_EOL; // ¥1,000
echo format_money(0.05, 4) . PHP_EOL; // ¥0.0500
<?php
function format_money_intl($money, $locale = 'zh_CN', $currency = 'CNY') {
$fmt = new NumberFormatter($locale, NumberFormatter::CURRENCY);
return $fmt->formatCurrency($money / 100, $currency); // 假設分為單位
}
echo format_money_intl(123456789); // ¥1,234,567.89 (自動適應地區格式)
優勢:自動處理各地區千分位符號 (空格/逗號/點)、貨幣符號位置、小數位標準、負數格式 (括號/紅色/負號)。需安裝 intl 擴展。
1234567.89),前端用 Intl.NumberFormat 或庫 (accounting.js) 格式化,支援用戶地區偏好。(1,234.56),前端 CSS 控制更靈活。