支援整數部分按中文數字單位(萬、億、兆)分段,小數部分遞歸處理,適合金額顯示場景。
<?php
function ch_num($num, $mode = true) {
$char = ["零", "壹", "貳", "三", "肆", "伍", "陸", "柒", "捌", "玖"];
$dw = ["", "拾", "佰", "仟", "", "萬", "億", "兆"];
$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 = [];
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] = "";
// 萬/億/兆 節點
if ($i % 4 == 0) $out[$i] .= $dw[4 + floor($i / 4)];
}
}
$retval = join("", array_reverse($out)) . $retval;
}
return $retval;
}
// 測試
echo ch_num("300045.0123"); // 輸出:叁拾萬零肆拾伍點零壹貳三
echo ch_num("880079.1234"); // 捌拾捌萬零柒拾玖點壹貳三四
echo ch_num("12345006789001.123"); // 拾貳兆叁仟肆佰伍拾億零陸仟柒佰捌拾玖萬零壹點壹貳三
mode=false 直接逐位轉換,不加單位^0* 正則去除整數部分前導零詳細說明:論壇原帖