/**
* 数字转化中文,例如,输入1234567 则输出一百二十三万四千五百六十七
* 思路:将整数和小数分开,使整数倒序,分别将每个整数替换成大写,再在每4位加上“万”,每8位加上“亿”
*
* @param string|int $num
*
* @return string
*/
function num2cn(string|float $num): string
{
$digit = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
$unit = ['', '十', '百', '千', '万', '亿'];
$isf = false;
$str = '';
$int = strval($num);
// 小数
if (strrpos($num, '.')) {
[$int, $float] = explode('.', $num);
$float = rtrim($float, '0');
}
// 负数
if ($int < 0) {
$isf = true;
$int = substr($int, 1);
}
$len = strlen($int);
$int = strrev($int); // 反转字符串
// 转换成大写
for ($i = 0; $i < $len; ++$i) {
$mod = $i % 8;
if ($mod === 0) $str .= $unit[5];
if ($mod === 4) $str .= $unit[4];
if ($mod = $i % 4) $str .= $unit[$mod];
$str .= $digit[$int[$i]];
}
// 处理特殊情况
$str = mb_substr($str, 1);
$str = strtr($str, ['十零' => '零', '百零' => '零', '千零' => '零']);
$str = preg_replace('/零+/u', '零', $str); // 去除连续的零
$str = strtr($str, ['万零' => '万', '亿零' => '亿']);
$str = ltrim($str, '零'); // 去除末尾的零
$str = mb_strrev($str); // 反转中文字符串
// 处理小数
if (isset($float) && $float) {
$len = strlen($float);
$str .= '点';
for ($i = 0; $i < $len; ++$i) $str .= $digit[$float[$i]];
}
return $isf ? '负' . $str : $str;
}
v(num2cn('10000304.05'));
v(num2cn('10020304.05'));
结果: