PHP 中文数字转阿拉伯数字
如果我要将 一千五百四十七
转成 1547
改如何操作
思路
第一步,将数字换出来一千五百四十七 ===> 1千5百4十7
第二步,将倍数乘回去1千5百4十7 ===> 1*1000 + 5*100 + 4*10 + 7 = 1547
PHP代码
function ch2num(string $ch) : int
{
//单位
$unit = [
'个' => 1,
'個' => 1,
'十' => 10,
'拾' => 10,
'百' => 100,
'佰' => 100,
'千' => 1000,
'仟' => 1000,
'万' => 10000,
'萬' => 10000,
'亿' => 100000000,
'億' => 100000000,
];
//词典
$dictionary = [
'零' => '',
'一' => 1,
'壹' => 1,
'二' => 2,
'貳' => 2,
'三' => 3,
'叁' => 3,
'四' => 4,
'肆' => 4,
'五' => 5,
'伍' => 5,
'六' => 6,
'陆' => 6,
'陸' => 6,
'七' => 7,
'柒' => 7,
'八' => 8,
'捌' => 8,
'九' => 9,
'玖' => 9,
];
$start = $result = 0;
$ch = str_replace(array_keys($dictionary), array_values($dictionary), $ch);
$len = mb_strlen($ch);
while($i = mb_substr($ch, $start, 1)) {
//优先判断数字和倍数是否完整,两个数值完整就累入
if (is_numeric($i) && isset($number) && isset($multiple)) {
$result += $number * $multiple;
//清除倍数,等待下次完整的数字和倍数
unset($multiple);
}
//循环到结尾了,计入最后一次
if ($start == $len-1) {
if (is_numeric($i)) {
//结尾是数字,如一千零五,直接累入
$result += $i;
} else {
//结尾是倍数,如一千零五十,相乘累入
$result += $number * $unit[$i];
}
break;
}
//记录数字和倍数
if (is_numeric($i)) {
//数字
$number = $i;
} else {
//倍数
$multiple = isset($multiple) ? $multiple * $unit[$i] : $unit[$i];
}
//移到下一位
$start++;
}
return $result;
}
$ch = "四万一千零五十";
$result = ch2num($ch);
printf("中文数字:%s, 转化后的阿拉伯数字:%d\n", $ch, $result);
php8.0
测试结果
D:\www\test>php ch2num.php
中文数字:四万一千零五十, 转化后的阿拉伯数字:41050
网友评论