PHP 求助 阿拉伯数字转中文数字
『回复列表(27|显示机器人聊天)』
@无期徒刑,简单优化下,看来这正则确实比纯数组遍历耗时间。另外,该正则已可去除“一十”开头的“一”
function better_convert_to_chinese_by_regex(int $n): string
{
if ($n <= 0) return '零';
$r = '';
$n = (string)$n;
$s = '#B#A#G#C#B#A#F#C#B#A#E#C#B#A#D#C#B#A#'; // 64位 PHP 最大整数也就19位十进制
for ($i = strlen($s) - 1, $j = strlen($n); $j > 0; $i -= 2) {
$s[$i] = $n[--$j];
}
$d = preg_replace_callback(
'/(?J)^[^1-9]*(?(?=1A)1)|(?<z>0)[0ABC]*(?:(?=[1-9])|(?<z>(?=[D-J]|$)))|'.
'(?<b>[D-J])(?<z>0)[0A-L]*(?:(?=[1-9])|(?<z>$))/',
fn($m) => ($m['b'] ?? '') . ($m['z'] ?? ''),
$s,
);
for ($i = 0, $l = strlen($d); $i < $l; $i++) {
$r .= unnamed[ord($d[$i]) - ord('0')];
}
return $r;
}
耗时如下,速度比纯数组版本差一点儿,但可读性好些,更容易修改(算了,可读性就那样,这正则我也要理解半天)
$ time php main.php < 65536_nums.txt >/dev/null
real 0m0.837s
user 0m0.688s
sys 0m0.141s
那几个数字的测试:
$ xargs -n1 <<<"100 101 120217 812368 1024842940147 $(((1 << 63) - 1))" | php main.php
100 一百
101 一百零一
120217 十二万零二百一十七
812368 八十一万二千三百六十八
1024842940147 一兆零二百四十八亿四千二百九十四万零一百四十七
9223372036854775807 九百二十二京三千三百七十二兆零三百六十八亿五千四百七十七万五千八百零七
和Python
去掉开头“一十”的“一”后的版本一致:
$ diff <(python3 main.py < 65536_nums.txt | sed 's/ 一十/ 十/') <(php main.php < 65536_nums.txt)
$