PHP 阿拉伯数字转中文

/ 0 评 / 阅读 440

公司的需求里有一个小地方要将阿拉伯数字转成中文,这里把我实现的代码分享出来,希望能够帮助其他需要的人,或者给一些启发。应该支持任意大的数字。

/**
 * 数字转中文
 *
 * @param int $num
 * @return string
 */
function num_to_chinese(int $num){

    $chunk=function(array $nums,int $size):array{
        $len=count($nums);
        $head=$len%$size;
        $chunk=[];
        $subSize=floor($len/$size);
        if($head){
            $chunk[$subSize]=array_slice($nums,0,$head);
        }

        for($i=0;$i<$subSize;$i++){
            $chunk[$subSize-$i-1]=array_slice($nums,$head+$i*$size,$size);
        }
        return  $chunk;
    };

    $chiLoop=['','万','亿'];

    $loopApply=function(int $loop,array $chiLoop):string{
        $chiLoopSize=count($chiLoop)-1;
        $res=[];
        for($i=$chiLoopSize;$i>0;$i--){
            $res[]=str_repeat($chiLoop[$i],floor($loop/$i));
            $loop=$loop%$i;
            if(!$loop){
                break;
            }
        }
        return implode('',array_reverse($res));
    };

    $chiNum = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'];
    $chiUni = ['','十', '百','千'];

    $looper=function($num,$suffix)use($chiNum,$chiUni){
        $len=count($num);
        $res=[];
        foreach ($num as $key=>$value){
            $value=(int)$value;
            if($value){
                $zero='';
                if($key && !$num[$key-1]){
                    $zero=$chiNum[0];
                }
                $res[]=$zero.$chiNum[$value].$chiUni[$len-$key-1];
            }
        }
        $res[]=$suffix;
        if($suffix && end($num)==='0'){
            $res[]=$chiNum[0];
        }

        return implode('',$res);
    };

    if(!$num){
        return $chiNum[0];
    }

    $numArr=str_split($num);
    $numChunk=$chunk($numArr,4);
    $res='';
    foreach ($numChunk as $loop=>$chunk){
        $res.=$looper($chunk,$loopApply($loop,$chiLoop));
    }

    if(mb_substr($res,0,2,'utf8')==='一十'){
        return mb_substr($res,1,null,'utf8');
    }

    return $res;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注