PHP 数字转大写中文
PHP入门小菜鸟一枚。下午要求写一个把数字转成大写中文的脚本,百度了一波,几十个博客和网站都是用的那四个代码,第一个运行不了,第二个有问题,不合要求,第三个第四个太长,懒得看,只好自己写个,部分代码抄别的,那么多博客相同的代码,我也不知道来源是谁。要去大概这样。
1. 120002129.25 转化后
壹億贰仟萬贰仟壹佰贰拾玖圆贰角伍分
2. 12000.2145 转化后
壹萬贰仟圆贰角壹分肆厘伍毫
3. 1020001211 转化后
壹拾億贰仟萬壹仟贰佰壹拾壹圆整
大致思路这样的:
- 从小数点分割成两部分,整数部分和小数部分分别处理。
- 整数四个一组进行处理,用substr函数分组,然后循环加上萬和億。
- 把多余的零删除掉。
- 小数部分遍历匹配相应的单位。
代码写出来了,刚刚发现了个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;
}