一个php写的人民币数字金额大小写转换的程序,个人测试过没发现什么错误,
下面贴出代码,欢迎大家测试.
以下为引用的内容: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>金额转大写--www.phperz.com</title> </head> <body> <?php function getcn($rmb){ $rmb=str_replace(",","",$rmb); //格式化一下类似1,000,000的金额 if (!ereg("^[0-9.]",$rmb))return "请输入正确的金额"; $arr1 = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); $arr2 = array('拾','佰','仟'); $arr=explode(".",$rmb); $rmb_len=strlen($arr[0]); //整数部分 $j=0; for ($i=0;$i<$rmb_len;$i++){ $bit=$arr[0][$rmb_len-$i-1]; $cn=$arr1[$bit]; $unit=$arr2[$j]; if ($i==0) { $re=$cn; } elseif ($i==4){ $re=$cn."万".$re; $j=0; } elseif ($i==8) { $re=$cn."亿".$re; $j=0; } else{ $j++; $re=$bit==0?"零".$re:$cn.$unit.$re; } } if ($arr[1]){ $arr[1][0]==0?$re=$re."元零":$re=$re."元".$arr1[$arr[1][0]]."角"; //角 $arr[1][1]==0?$re=$re."零分":$re=$re.$arr1[$arr[1][1]]."分"; //分 } //echo $re."<br>"; $re=preg_replace(array("/(零)+$/","/(零)+/","/零万/","/零亿/"),array("","零","万","亿"),$re); //替换一些数据 $arr[1]?$re:$re.="元整"; echo $re; } $rmb="10010110101.01"; echo $rmb."<br>"; getcn($rmb); ?> </body> </html> |
只实现了大概的功能,对于输入的数据并没有严格的检查. 用时记得在多检查一下输入的数据.
个人觉得此题的难点在于转换11001000类似的数据,
1.金额分为整数部分和小数部分.转换时必须将他们拆开,分别转换.
2.建二个数组: $arr1(0-9的大写) 和 $arr2(金额单位:拾,佰,仟) 之所以没有把元,万,亿也放到这里是因为拾,佰,仟每过三位数,他们便会出现一次.而元,万,亿不是.
3.循环出整数部分的每一位数字做为$arr1的下标得到大写数字,同时检查当前位是不是元位,或万位,或亿位,如果是,把计数变量$j重置成0.如果不是:检查当前拾,佰,仟位是不是为零.如果为0则丢掉单位.如果不为零则用$j做$arr2的下标求得当前的单位.
4.检查当前的角位和分位是否为0,做出相应的操作,
5.程序执行完第3步后,对于11001000类似的金额会出现 "零零"或"零万"的数据,这一步主要是对这样的数据进行格式化.
把末尾的零删掉,把中间出现的一个或多个零合并成一个零.把零万替换成万.
6.如果没有小数就再后面加个"元整".