一种中文数字转阿拉伯数字的解决方案

网上不少的代码都有bug,在此给出一种方案:

// chineseToNumber('二百');

function chineseToNumber($str) {
    if(is_numeric($str)){
        return intval($str);
    }
    $words = preg_split('/(?<!^)(?!$)/u', $str);

    $pos = 0;
    $section = 0;
    $rtn = 0;
    $secUnit = false;
    $number = 0;
    $length = count($words);
    while ($pos < $length) {
        $num = chineseToValue(mb_substr($str, $pos, 1));
        if ($num >= 0) {
            $number = $num;
            $pos += 1;
            if ($pos >= $length) {
                $section += $number;
                $rtn += $section;
                break;
            }
        } else {
            $unit = chineseToUnit(mb_substr($str, $pos, 1), $secUnit);
            if ($secUnit) {
                $section = ($section + $number) * $unit;
                $rtn += $section;
                $section = 0;
            } else {
                $section += ($number * $unit);
            }

            $number = 0;
            $pos += 1;
            if($pos >= $length) {
                $rtn += $section;
                break;
            }
        }
    }
    return $rtn;
}

function chineseToUnit($str, &$secUnit)
{
    $data = [
        ["十", 10, false],
        ["百", 100, false],
        ["千", 1000, false],
        ["万", 10000, true],
        ["亿", 100000000, true],
    ];
    foreach ($data as $v) {
        if ($v[0] === $str) {
            $secUnit = $v[2];
            return $v[1];
            break;
        }
    }

    return null;
}

function chineseToValue($str)
{
    $d = array(
        '一' => '1','二' => '2','三' => '3','四' => '4','五' => '5','六' => '6','七' => '7','八' => '8','九' => '9',
        '壹' => '1','贰' => '2','叁' => '3','肆' => '4','伍' => '5','陆' => '6','柒' => '7','捌' => '8','玖' => '9',
        '零' => 0,
        '两' => 2
    );
    foreach ($d as $k => $v) {
        if ($k === $str) {
            return $v;
        }
    }

    return -1;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
Complicated

收藏了!

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!