PHP 中文数字转阿拉伯数字

2022-12-20  本文已影响0人  不可思议的黄老师

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
上一篇下一篇

猜你喜欢

热点阅读