zoukankan      html  css  js  c++  java
  • 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;
    }
     
    
    
    
     
     
  • 相关阅读:
    触摸事件传递与响应者链条
    运动事件Motion Events
    手势识别
    MVC模式
    单例模式
    观察者模式(一对多)
    关于多线程的介绍
    Sandbox简介和路径获取
    NSFileManager和NSFileHandle使用
    归档储存
  • 原文地址:https://www.cnblogs.com/qy-brother/p/7650959.html
Copyright © 2011-2022 走看看