PHP实现阿拉伯数字 1/2/3/4 转成中文小写数字一二三四实现代码
function numberToChinese(string $num): string
{
if (!ctype_digit($num)) return '';
if ($num === '0') return '零';
$cn = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
// 单位映射:3-千, 2-百, 1-十, 0-个
$units = ['', '十', '百', '千'];
$groups = ['', '万', '亿', '兆', '京', '垓', '秭', '穰', '沟', '涧', '正', '载'];
$len = strlen($num);
// 补齐为4的倍数,方便分组处理(例如 123 -> 0123)
$padLen = (4 - $len % 4) % 4;
$num = str_pad($num, $len + $padLen, '0', STR_PAD_LEFT);
$parts = str_split($num, 4);
$totalParts = count($parts);
$result = '';
foreach ($parts as $i => $part) {
$secStr = '';
$hasZero = false;
// 处理每一个4位分段
for ($j = 0; $j < 4; $j++) {
$d = (int)$part[$j];
if ($d === 0) {
$hasZero = true;
} else {
// 如果当前数字非零,且之前有未处理的零,则补一个“零”
if ($hasZero) {
$secStr .= '零';
$hasZero = false;
}
// 拼接 数字 + 单位
// $j=0对应千位(3), $j=3对应个位(0),使用 3-$j 索引 $units
$secStr .= $cn[$d] . $units[3 - $j];
}
}
// 如果该分段有意义(不是全零)
if ($secStr !== '') {
// 去除分段开头的零(例如 "0010" -> "一十")
$temp = ltrim($secStr, '零');
// 加上大单位(万、亿等)
$groupIdx = $totalParts - $i - 1;
$temp .= $groups[$groupIdx];
// 拼接到总结果
// 关键逻辑:如果前面已有结果,且当前分段原始字符串以零开头,
// 说明中间跨越了全零的组,需要补一个“零”(例:10000001 -> 一亿零一)
if ($result !== '' && strpos($secStr, '零') === 0) {
$result .= '零' . $temp;
} else {
$result .= $temp;
}
}
}
// 特殊处理:将开头的“一十”改为“十”(例:10-19, 100000010)
return preg_replace('/^一十/', '十', $result);
}

相关文章