/**
* 获取人民币数字大写
* @param int|string $num
* @return string
*/
function get_rmb(int|string $num): string
{
$str = '';
$a = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
$b = ['分', '角', '元', '整'];
$c = ['', '拾', '佰', '仟'];
$d = ['万', '亿'];
// 四舍五入 保留两位小数
$num = sp_round($num, 2);
// 反转字符串
$num = strrev($num);
// 小数
if (($point = strpos($num, '.')) !== false) {
if ($point == 2) {
$str .= $b[0] . $a[$num[0]] . ($num[1] ? $b[1] : '') . $a[$num[1]]; // 角分
} else {
$str .= $b[1] . $a[$num[0]]; // 角
}
$num = substr($num, $point + 1);
} else {
$str .= $b[3]; // 整
}
$str .= $b[2]; // 元
$is_pass = false; // 是否经过一位非零数字
$no_zero = true; // 没有零
$len = strlen($num); // 字符串长度
// 第一位数字
if ($num[0]) {
$is_pass = true;
$str .= $a[$num[0]];
}
// 第一位以后
for ($i = 1; $i < $len; ++ $i) {
// 处理万亿
if (($mod = $i % 4) == 0) {
$is_pass = false; // 是否经过一位非零数字
$no_zero = true; // 没有零
$div = intdiv($i, 4);
$str .= str_repeat($d[1], intdiv($div, 2)); // 亿
$str .= $div % 2 ? $d[0] : ''; // 万
}
if ($num[$i]) {
$is_pass = true;
$str .= $c[$mod] . $a[$num[$i]];
} else {
if ($is_pass && $no_zero) {
$str .= $a[$num[$i]];
$no_zero = false;
}
}
}
return mb_strrev($str); // 反转多字节字符串
}
v(get_rmb('1004560007807005.123456'));
v(get_rmb('123456789012304560.99956'));
注:依赖 sp_round函数(对长数字字符串四舍五入)mb_strrev函数(反转多字节字符串),之前文章有
执行结果: