php 把数字转化为大写中文

时间:2021-04-06 06:54:59

PHP 数字转大写中文

PHP入门小菜鸟一枚。下午要求写一个把数字转成大写中文的脚本,百度了一波,几十个博客和网站都是用的那四个代码,第一个运行不了,第二个有问题,不合要求,第三个第四个太长,懒得看,只好自己写个,部分代码抄别的,那么多博客相同的代码,我也不知道来源是谁。要去大概这样。

    1. 120002129.25 转化后
        壹億贰仟萬贰仟壹佰贰拾玖圆贰角伍分
       
    2. 12000.2145 转化后
        壹萬贰仟圆贰角壹分肆厘伍毫
        
    3. 1020001211  转化后
        壹拾億贰仟萬壹仟贰佰壹拾壹圆整
        

大致思路这样的:

  1. 从小数点分割成两部分,整数部分和小数部分分别处理。
  2. 整数四个一组进行处理,用substr函数分组,然后循环加上萬和億。
  3. 把多余的零删除掉。
  4. 小数部分遍历匹配相应的单位。

代码写出来了,刚刚发现了个bug,暂时不想改,就是这么任性。感觉还有优化的地方。我看到最短的代码只有20多行,虽然我运行不了,思路也不一样。

代码如下:


<?php
function to_upcase_chinese($num){
    $digitArr1 = [1 => '',2 => '拾',3 => '佰',4 => '仟'];
    $Array = [0 => '',1 => '萬', 2 => '億'];
    $intArr = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
    $decimalArr = [0 => '角',1 => '分',2 => '厘',3 => '毫'];
    $int = null;
    $decimal = null;
    if (false !== strpos($num,'.')) {
        $spreator = explode('.',$num);
        $int = reset($spreator);
        $decimal = end($spreator);
    } else {
        $int = (string)$num;
    }
    $combine = '';
    $residue = floor((strlen($int) / 4));
    $mol = strlen($int) % 4;
    for($b =  $residue + 1; $b >= 1; ){
        $length = $b == ($residue + 1) ? $mol : 4;
        $b--;
        $st = substr($int,($b * (-4)) - 4, $length);
        if($st !== ''){
            for ($a = 0; $a < strlen($st); $a++) {
                if (intval($st[$a]) === 0) {
                    $combine .=  '零';
                }
                else{
                    $combine .= $intArr[intval($st[$a])].$digitArr1[strlen($st)-$a];
                }
            }
            $combine .= $Array[$b];
        }
    }
    $combine1 = '';
    if ($decimal !== null || intval($decimal) !== 0 || strlen($decimal) !== 0) {
        for ($i=0; $i < (strlen($decimal) < 4 ? strlen($decimal): 4); $i++) {
            if (intval($decimal[$i]) === 0) {
                $combine1 .=  '';
            } else {
                $combine1 .=  $intArr[intval($decimal[$i])].$decimalArr[$i];
            }
        }
    }else{
        $combine1 .= '整';
    }
    $combine = $combine.'圆'.$combine1;
    var_dump('悄悄写个dump,现在博客园叫被水淹死的大白鲨')
    $j = 0;
    $slen = strlen($combine);
    while ($j < $slen) {
        $m = substr($combine, $j, 6);
        if ($m == '零圆' || $m == '零萬' || $m == '零億' || $m == '零零') {
            $left = substr($combine, 0, $j);
            $right = substr($combine, $j + 3);
            $combine = $left . $right;
            $j = $j-3;
            $slen = $slen-3;
        }
        $j = $j + 3;
    }
    return $combine;
}

你的转载是对我最大的鼓励。有人给点思路吗?很少写这种。

好久才写一篇博客,emmmm,有人看吗?有人点个赞吗? (`・ω・´)