php中文轉阿拉伯數字

面試題,當時寫了一個漏洞百出,被人鄙視了,因此回來用一上午寫了一個,本身測試了一下,好像還能夠。面試

思路數組

如中文數字 測試

七百七十八萬億四千七百二十七千五百七十四千四百八十六

若是把紅色文字看作單位,那麼用這些單位分割後,其餘部分都是個十百千的數字。把這些數字乘以其單位求和,就是結果了。

代碼
function ch2num($str){
    //單位數組用於循環遍歷,單位順序從大到小
    $c = [
        '萬億'=>1000000000000,
        '億' => 100000000,
        '萬' => 10000,
    ];

    //中文替換數字規則,零沒什麼卵用;因此去掉
    $b = [
        '一' =>1,
        '二' =>2,    
        '三' =>3,
        '四' =>4,
        '五' =>5,
        '六' =>6,
        '七' =>7,
        '八' =>8,
        '九' =>9,
        '零' =>'',
    ];

    //替換數字
    $str =  str_replace(array_keys($b), array_values($b), $str);
    //結果 7百7十8萬億4千7百2十億7千5百7十萬4千4百8十
  //若是字符串以十開頭,前邊加1
    if(mb_strpos($str, '十' ,0 ,'utf-8') === 0)
        $str = '1'.$str;
      
    //初始化一個數組
    $arr[] = array(
        'str'    => $str, //字符串
        'unit'  => 1,     //單位
    );
    //將字符串按單位切分
    foreach ($c as $key => $value) {
        $brr = [];
        foreach ($arr as $item) {
            if(strpos($item['str'], $key)){
                $sun = explode($key, $item['str'],2);
                $brr[] = [
                    'str' => $sun[0],
                    'unit' => $value,
                ];
                $brr[] = [
                    'str' => $sun[1],
                    'unit' => $item['unit'],
                ];
            }else{
                $brr[] = $item;
            }
        }
        $arr = $brr;
    }
    /*    結果
        (
        [0] => Array
            (
                [str] => 7百7十8
                [unit] => 1000000000000
            )

        [1] => Array
            (
                [str] => 4千7百2十
                [unit] => 100000000
            )

        [2] => Array
            (
                [str] => 7千5百7十
                [unit] => 10000
            )

        [3] => Array
            (
                [str] => 4千4百8十6
                [unit] => 1
            )

        )*/

    //遍歷求和
    $sum = 0;
    foreach ($arr as $item) {
        $sum += getNum($item['str'],$item['unit']);
    }
    return $sum;
}


//將分組後的字符串轉化成數字,並乘以單位
function getNum($str,$st){
    //倍數
    $a = [
        '千'=>1000,
        '百'=>100,
        '十'=>10
    ];
    //開始值
    $num = 0;
    //當前值所在位數
    $step = 1;
    //單位
    $un = 1;
    $arr =  preg_split('/(?<!^)(?!$)/u', $str);
    while (count($arr)) {
        $m = array_pop($arr);
        //若是是位數;更新倍數
        if(!empty($a[$m])){
            $step = $a[$m];
        }
        if(is_numeric($m)){
            $num += $m * $step;
        }
    }
    return $num * $st;
}
 
相關文章
相關標籤/搜索