將數字字串(整數或浮點數)轉換為中文大寫金額格式,如 300045.0123 → 叁拾萬零肆拾伍點零壹貳叁。支援「萬、億、兆」大單位,正確處理連續零的合併與單位補齊。
<?php
function ch_num($num, $mode = true) {
$char = array("零", "壹", "貳", "叁", "肆", "伍", "陸", "柒", "捌", "玖");
$dw = array("", "拾", "佰", "仟", "", "萬", "億", "兆");
$dec = "點";
$retval = "";
// 正則分離整數與小數部分
if ($mode) {
preg_match_all("/^0*(\d*)\.?(\d*)/", $num, $ar);
} else {
preg_match_all("/(\d*)\.?(\d*)/", $num, $ar);
}
// 遞歸處理小數部分
if ($ar[2][0] != "") {
$retval = $dec . ch_num($ar[2][0], false);
}
// 處理整數部分
if ($ar[1][0] != "") {
$str = strrev($ar[1][0]); // 反轉字串,從個位開始處理
$out = array();
for ($i = 0; $i < strlen($str); $i++) {
$digit = $str[$i];
$out[$i] = $char[$digit];
if ($mode) {
// 非零數字加單位(拾/佰/仟)
$out[$i] .= ($digit != "0") ? $dw[$i % 4] : "";
// 連續零合併:若當前位與前一位皆為零,清空當前輸出
if ($digit + $str[$i-1] == 0) {
$out[$i] = "";
}
// 每 4 位補大單位(萬/億/兆)
if ($i % 4 == 0) {
$out[$i] .= $dw[4 + floor($i / 4)];
}
}
}
$retval = join("", array_reverse($out)) . $retval;
}
return $retval;
}
// 測試
echo ch_num("300045.0123"); // 輸出:叁拾萬零肆拾伍點零壹貳叁
?>
^0*(\d*)\.?(\d*) 去除整數前導零,分別捕獲整數部($ar[1][0])與小數部($ar[2][0])。false 模式不加單位),前綴「點」。$i 對應位權(0=個, 1=拾, 2=佰, 3=仟, 4=萬...)。$dw[$i % 4] 循環「拾、佰、仟、空」。$i % 4 == 0)補 $dw[4 + floor($i/4)] → 萬、億、兆。$dw 可擴展「京、垓」等更高單位。此函式無外部依賴,效能優異,適合發票列印、財務報表、合同金額轉換等中文系統場景。