php封装好的人民币数值转中文大写类
php封装好的人民币数值转中文大写类
classNum2RmbClass{ /** *人民币数值转中文大写 *@authorSunsCheung *@time2015.11.11 *@paramstring$number数值默认为0 *@paramstring$int_unit币种单位,默认"元",有的需求可能为"圆" *@parambool$is_round是否对小数进行四舍五入 *@parambool$is_extra_zero是否对整数部分以0结尾,小数存在的数字附加0,比如1960.30, *有的系统要求输出"壹仟玖佰陆拾元零叁角",实际上"壹仟玖佰陆拾元叁角"也是对的 *@parambool$dec_to_int是否对让小数部分进位到个位,如果进位,个位加1,小数为0, *@returnstring */ publicstaticfunctionnum2rmb($number=0,$int_unit='元',$is_round=TRUE,$is_extra_zero=FALSE,$dec_to_int=FALSE){ //将数字切分成两段 $parts=explode('.',$number,2); $int=isset($parts[0])?strval($parts[0]):'0'; $dec=isset($parts[1])?strval($parts[1]):''; //如果小数点后多于2位,不四舍五入就直接截,否则就处理 $dec_len=strlen($dec); if(isset($parts[1])&&$dec_len>2){ if($is_round){ if(round(floatval("0.".$dec),2)==1&&$dec_to_int){//小数进位到个位 $int=empty($int)?1:strval($parts[0]+1); $dec=0; }elseif(round(floatval("0.".$dec),2)==1){//小数不进位到个位 $dec="99"; }else{ $dec=substr(strrchr(strval(round(floatval("0.".$dec),2)),'.'),1); echo$dec;die('boss'); } }else{ $dec=substr($parts[1],0,2); } } //当number为0.001时,小数点后的金额为0元 if(empty($int)&&empty($dec)){ return'零'; } //定义 $chs=array('0','壹','贰','叁','肆','伍','陆','柒','捌','玖'); $uni=array('','拾','佰','仟'); $dec_uni=array('角','分'); $exp=array('','万'); $res=''; //整数部分从右向左找 for($i=strlen($int)-1,$k=0;$i>=0;$k++){ $str=''; //按照中文读写习惯,每4个字为一段进行转化,i一直在减 for($j=0;$j<4&&$i>=0;$j++,$i--){ $u=$int{$i}>0?$uni[$j]:'';//非0的数字后面添加单位 $str=$chs[$int{$i}].$u.$str; } //echo$str."|".($k-2)."<br>"; $str=rtrim($str,'0');//去掉末尾的0 $str=preg_replace("/0+/","零",$str);//替换多个连续的0 if(!isset($exp[$k])){ $exp[$k]=$exp[$k-2].'亿';//构建单位 } $u2=$str!=''?$exp[$k]:''; $res=$str.$u2.$res; } //如果小数部分处理完之后是00,需要处理下 $dec=rtrim($dec,'0'); //小数部分从左向右找 if(!empty($dec)){ $res.=$int_unit; //是否要在整数部分以0结尾的数字后附加0,有的系统有这要求 if($is_extra_zero){ if(substr($int,-1)==='0'){ $res.='零'; } } for($i=0,$cnt=strlen($dec);$i<$cnt;$i++){ $u=$dec{$i}>0?$dec_uni[$i]:'';//非0的数字后面添加单位 $res.=$chs[$dec{$i}].$u; } $res=rtrim($res,'0');//去掉末尾的0 $res=preg_replace("/0+/","零",$res);//替换多个连续的0 }else{ $res.=$int_unit.'整'; } return$number<0?"(负)".$res:$res; } }
使用方法
//$a=newNum2RmbClass; echo(Num2RmbClass::num2rmb('1600020039.9989','圆',false,false,false));
再给大家分享一个简单点的
functioncny($ns) { static$cnums=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"), $cnyunits=array("圆","角","分"), $grees=array("拾","佰","仟","万","拾","佰","仟","亿"); list($ns1,$ns2)=explode(".",$ns,2); $ns2=array_filter(array($ns2[1],$ns2[0])); $ret=array_merge($ns2,array(implode("",_cny_map_unit(str_split($ns1),$grees)),"")); $ret=implode("",array_reverse(_cny_map_unit($ret,$cnyunits))); returnstr_replace(array_keys($cnums),$cnums,$ret); } function_cny_map_unit($list,$units) { $ul=count($units); $xs=array(); foreach(array_reverse($list)as$x) { $l=count($xs); if($x!="0"||!($l%4)) { $n=($x=='0'?'':$x).($units[($l-1)%$ul]); } else { $n=is_numeric($xs[0][0])?$x:''; } array_unshift($xs,$n); } return$xs; } $value='23058.04'; printcny($value);echo' '; 输出:贰万叁仟零伍拾捌圆肆角
再来一个网友做好的也很不错
/** *数字金额转换成中文大写金额的函数 *StringInt$num要转换的小写数字或小写字符串 *return大写字母 *小数位为两位 **/ functionnum_to_rmb($num){ $c1="零壹贰叁肆伍陆柒捌玖"; $c2="分角元拾佰仟万拾佰仟亿"; //精确到分后面就不要了,所以只留两个小数位 $num=round($num,2); //将数字转化为整数 $num=$num*100; if(strlen($num)>10){ return"金额太大,请检查"; } $i=0; $c=""; while(1){ if($i==0){ //获取最后一位数字 $n=substr($num,strlen($num)-1,1); }else{ $n=$num%10; } //每次将最后一位数字转化为中文 $p1=substr($c1,3*$n,3); $p2=substr($c2,3*$i,3); if($n!='0'||($n=='0'&&($p2=='亿'||$p2=='万'||$p2=='元'))){ $c=$p1.$p2.$c; }else{ $c=$p1.$c; } $i=$i+1; //去掉数字最后一位了 $num=$num/10; $num=(int)$num; //结束循环 if($num==0){ break; } } $j=0; $slen=strlen($c); while($j<$slen){ //utf8一个汉字相当3个字符 $m=substr($c,$j,6); //处理数字中很多0的情况,每次循环去掉一个汉字“零” if($m=='零元'||$m=='零万'||$m=='零亿'||$m=='零零'){ $left=substr($c,0,$j); $right=substr($c,$j+3); $c=$left.$right; $j=$j-3; $slen=$slen-3; } $j=$j+3; } //这个是为了去掉类似23.0中最后一个“零”字 if(substr($c,strlen($c)-3,3)=='零'){ $c=substr($c,0,strlen($c)-3); } //将处理的汉字加上“整” if(empty($c)){ return"零元整"; }else{ return$c."整"; } } echonum_to_rmb(23000000.00);//贰仟叁佰万元整