看了网上很多篇教程,发现多多少少都有一些问题,导致部分数字无法完成转换,例如十、百、千等,或者中间会出现一些连续的零,还有一些会出现零百、零千的情况。这些问题在编写过程中也遇到过,后来参考了其他一些“大牛”的算法,最终修改成了现在的版本。送上代码~
<?php
// 数字转大写
function NumberToCapital($num) {
$num = $num * 1;
$NUM_CAPITAL = [
0 => '零',
1 => '一',
2 => '二',
3 => '三',
4 => '四',
5 => '五',
6 => '六',
7 => '七',
8 => '八',
9 => '九'
];
$UNIT = ['元', '十', '百', '千', '万', '十', '百', '千', '亿'];
$arr = [];
$count = 0;
if (10 > $num) {
// 如果是十以内数字,直接转换
$arr[] = $NUM_CAPITAL[$num];
} else {
while ($num != 0) {
$arr[] = $UNIT[$count++];
$temp = $num % 10;
$arr[] = $NUM_CAPITAL[$temp];
$num = floor($num / 10);
}
}
$arr = array_reverse($arr);
// 处理格式
$str = implode('', $arr);
$str = preg_replace("/零+元/", "", $str);
$str = preg_replace("/零+万/", "万", $str);
$str = preg_replace("/零十/", "零", $str);
$str = preg_replace("/零百/", "零", $str);
$str = preg_replace("/零千/", "零", $str);
$str = preg_replace("/元/", "", $str);
$str = preg_replace("/(零)+/", "零", $str);
// 10~19数字需要省略十位数
if ('一十' == substr($str, 0, 6)) {
$str = str_replace('一十', '十', $str);
}
// 避免最后一位为0
if (3 < strlen($str) && '零' == substr($str, -3)) {
$str = substr($str, 0, strlen($str)-3);
}
return $str;
}
$num = 10101;
echo '<pre>';var_dump(NumberToCapital($num));exit();
如果有问题或需要优化的地方,还请大家多多指点~~