看了网上很多篇教程,发现多多少少都有一些问题,导致部分数字无法完成转换,例如十、百、千等,或者中间会出现一些连续的零,还有一些会出现零百、零千的情况。这些问题在编写过程中也遇到过,后来参考了其他一些“大牛”的算法,最终修改成了现在的版本。送上代码~
<?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();
如果有问题或需要优化的地方,还请大家多多指点~~