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);//贰仟叁佰万元整