例子1
代码如下 | 复制代码 |
function change_num($num) { $d = array('零','壹','贰','叁','肆','伍','陆','柒','捌','玖'); $e = array('元','拾','佰','仟','万','拾万','佰万','仟万','亿','拾亿','佰亿','仟亿','万亿'); $p = array('分','角'); $zheng='整'; //追加"整"字 $final = array(); //结果 $inwan=0; //是否有万 $inyi=0; //是否有亿 $len_pointdigit=0; //小数点后长度 $y=0; if($c = strpos($num, '.')) //有小数点,$c为小数点前有几位数 { $len_pointdigit = strlen($num)-strpos($num, '.')-1; // 判断小数点后有几位数 if($c>13) //简单的错误处理 { echo "数额太大,已经超出万亿."; die(); } elseif($len_pointdigit>2) //$len_pointdigit小数点后有几位 { echo "小数点后只支持2位."; die(); } } else //无小数点 { $c = strlen($num); $zheng = '整'; } for($i=0;$i<$c;$i++) //处理整数部分 { $bit_num = substr($num, $i, 1); //逐字读取 左->右 if($bit_num!=0 || substr($num, $i+1, 1)!=0) //当前是零 下一位还是零的话 就不显示 @$low2chinses = $low2chinses.$d[$bit_num]; if($bit_num || $i==$c-1) @$low2chinses = $low2chinses.$e[$c-$i-1]; } for($j=$len_pointdigit; $j>=1; $j--) //处理小数部分 { $point_num = substr($num, strlen($num)-$j, 1); //逐字读取 左->右 if($point_num != 0) @$low2chinses = $low2chinses.$d[$point_num].$p[$j-1]; //if(substr($num, strlen($num)-2, 1)==0 && substr($num, strlen($num)-1, 1)==0) //小数点后两位都是0 } $chinses = str_split($low2chinses,2); //字符串转换成数组 //print_r($chinses); for($x=sizeof($chinses)-1;$x>=0;$x--) //过滤无效的信息 { if($inwan==0&&$chinses[$x]==$e[4]) //过滤重复的"万" { $final[$y++] = $chinses[$x]; $inwan=1; } if($inyi==0&&$chinses[$x]==$e[8]) //过滤重复的"亿" { $final[$y++] = $chinses[$x]; $inyi=1; $inwan=0; } if($chinses[$x]!=$e[4]&&$chinses[$x]!=$e[8]) //进行整理,将最后的值赋予$final数组 $final[$y++] = $chinses[$x]; } $newstring=(array_reverse($final)); //$final为倒数组,$newstring为正常可以使用的数组 $nstring=join($newstring); //数组变成字符串 if(substr($num,-2,1)==0 && substr($num,-1)<>0) //判断原金额角位为0 ? 分位不为0 ? { $nstring=substr($nstring,0,(strlen($nstring)-4))."零".substr($nstring,-4,4); //这样加一个零字 } $fen="分"; $fj=substr_count($nstring, $fen); //如果没有查到分这个字 return $nstring=($fj==0)?$nstring.$zheng:$nstring; //就将"整"加到后面 } |
例子2
1.支持天文数字,整数位理论上可以无限的长;
2.支持小数,对于货币,一般精确到小数后两位,可以设置小数位是否四舍五入;
3.支持自定义货币单位,有的系统要求大写是"圆",有的要求是"元",可以自定义;
4.支持整数以0结束并含有小数的数字自定义末尾补"零",比如有的系统要求1960.30这样的数字转大写之后是"壹仟玖佰陆拾元叁角",而有的系统则要求"壹仟玖佰陆拾元零叁角",这两种情况按"正确填写票据和结算凭证的基本规定"都是正确的,现在可已自定义。
代码如下 | 复制代码 |
<?php /** * 人民币小写转大写 * * @param string $number 数值 * @param string $int_unit 币种单位,默认"元",有的需求可能为"圆" * @param bool $is_round 是否对小数进行四舍五入 * @param bool $is_extra_zero 是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30, * 有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的 * @return string * @site www.111cn.net */ function num2rmb($number = 0, $int_unit = '元', $is_round = TRUE, $is_extra_zero = FALSE) { // 将数字切分成两段 $parts = <A class=infotextkey href="http://www." target=_blank>explode</A>('.', $number, 2); $int = <A class=infotextkey href="http://www.111cn.net/" target=_blank>isset</A>($parts[0]) ? strval($parts[0]) : '0'; $dec = isset($parts[1]) ? strval($parts[1]) : ''; // 如果小数点后多于2位,不四舍五入就直接截,否则就处理 // 当number为0.001时,小数点后的金额为0元 // 定义 // 整数部分从右向左找 // 如果小数部分处理完之后是00,需要处理下 // 小数部分从左向右找 // 是否要在整数部分以0结尾的数字后附加0,有的系统有这要求 for($i = 0, $cnt = strlen($dec); $i < $cnt; $i++) echo "<pre>"; |
例子3
看上面的个人更喜欢下面这个
代码如下 | 复制代码 |
//把数字金额转换成中文大写数字的函数 function num2rmb ($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿"; $num=round($num,2); $i=0; while (1){ $p1=substr($c1,2*$n,2); $p2=substr($c2,2*$i,2); $i=$i+1; if($num==0){ //we chop out the useless characters to form the correct output if ($m=='零元' || $m=='零万' || $m=='零亿' || $m=='零零'){ if(substr($c,strlen($c)-2,2)=='零'){ return $c; |