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

网上不少的代码都有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 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1
Complicated

收藏了!

3年前 评论

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