🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### 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; } ~~~