/** * 获取人民币数字大写 * @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函数(反转多字节字符串),之前文章有
执行结果: