PHP实现阿拉伯数字 1/2/3/4 转成中文小写数字一二三四

      发布在:后端技术      评论:0 条评论

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);
}

e9af79f7c4f03c0.gif

相关文章
热门推荐