php将金额数字转化为中文大写
php将金额数字转化为中文大写
echotoChineseNumber(1234567890);//壹拾贰亿叁仟肆佰伍拾陆万柒仟捌佰玖拾圆
functiontoChineseNumber($money){
$money=round($money,2);
$cnynums=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
$cnyunits=array("圆","角","分");
$cnygrees=array("拾","佰","仟","万","拾","佰","仟","亿");
list($int,$dec)=explode(".",$money,2);
$dec=array_filter(array($dec[1],$dec[0]));
$ret=array_merge($dec,array(implode("",cnyMapUnit(str_split($int),$cnygrees)),""));
$ret=implode("",array_reverse(cnyMapUnit($ret,$cnyunits)));
returnstr_replace(array_keys($cnynums),$cnynums,$ret);
}
functioncnyMapUnit($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;
}
代码二:
/**
*数字金额转换成中文大写金额的函数
*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);//贰仟叁佰万元整
代码三:
<?php
//先贴一个数字转中文的,最多12位数
functionconvert_2_cn($num){
$convert_cn=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
$repair_number=array('零仟零佰零拾零','万万','零仟','零佰','零拾');
$unit_cn=array("拾","佰","仟","万","亿");
$exp_cn=array("","万","亿");
$max_len=12;
$len=strlen($num);
if($len>$max_len){
return'outnumber';
}
$num=str_pad($num,12,'-',STR_PAD_LEFT);
$exp_num=array();
$k=0;
for($i=12;$i>0;$i--){
if($i%4==0){
$k++;
}
$exp_num[$k][]=substr($num,$i-1,1);
}
$str='';
foreach($exp_numas$key=>$nums){
if(array_sum($nums)){
$str=array_shift($exp_cn).$str;
}
foreach($numsas$nk=>$nv){
if($nv=='-'){continue;}
if($nk==0){
$str=$convert_cn[$nv].$str;
}else{
$str=$convert_cn[$nv].$unit_cn[$nk-1].$str;
}
}
}
$str=str_replace($repair_number,array('万','亿','-'),$str);
$str=preg_replace("/-{2,}/","",$str);
$str=str_replace(array('零','-'),array('','零'),$str);
return$str;
}
echoconvert_2_cn(1111)."\n";
echoconvert_2_cn(111111)."\n";
echoconvert_2_cn(111111111111)."\n";
//补充一个中文转数字的
functioncn_2_num($str){
$convert_cn=array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
$skip_words=array("拾","佰","仟");
$str=str_replace($skip_words,"",$str);
$len=mb_strlen($str,'utf-8');
$num=0;
$k='';
for($i=0;$i<$len;$i++){
$cn=mb_substr($str,$i,1,'utf-8');
if($cn=='亿'){
$num=$num+intval($k)*100000000;
$k='';
}elseif($cn=='万'){
$num=$num+intval($k)*10000;
$k='';
}else{
$k=$k.array_search($cn,$convert_cn);
}
}
if($k){
$num=$num+intval($k);
}
return$num;
}
echocn_2_num('壹仟壹佰壹拾壹亿壹仟壹佰壹拾壹万壹仟壹佰壹拾壹')."\n";
echocn_2_num('拾壹万壹仟壹佰壹拾壹')."\n";
?>
代码四:
functionconvertCurrency(currencyDigits){
//Constants:
varMAXIMUM_NUMBER=99999999999.99;
//Predefinetheradixcharactersandcurrencysymbolsforoutput:
varCN_ZERO="零";
varCN_ONE="壹";
varCN_TWO="贰";
varCN_THREE="叁";
varCN_FOUR="肆";
varCN_FIVE="伍";
varCN_SIX="陆";
varCN_SEVEN="柒";
varCN_EIGHT="捌";
varCN_NINE="玖";
varCN_TEN="拾";
varCN_HUNDRED="佰";
varCN_THOUSAND="仟";
varCN_TEN_THOUSAND="万";
varCN_HUNDRED_MILLION="亿";
varCN_SYMBOL="人民币";
varCN_DOLLAR="元";
varCN_TEN_CENT="角";
varCN_CENT="分";
varCN_INTEGER="整";
//Variables:
varintegral;//Representintegralpartofdigitnumber.
vardecimal;//Representdecimalpartofdigitnumber.
varoutputCharacters;//Theoutputresult.
varparts;
vardigits,radices,bigRadices,decimals;
varzeroCount;
vari,p,d;
varquotient,modulus;
//Validateinputstring:
currencyDigits=currencyDigits.toString();
if(currencyDigits==""){
alert("Emptyinput!");
return"";
}
if(currencyDigits.match(/[^,.\d]/)!=null){
alert("Invalidcharactersintheinputstring!");
return"";
}
if((currencyDigits).match(/^((\d{1,3}(,\d{3})*(.((\d{3},)*\d{1,3}))?)|(\d+(.\d+)?))$/)==null){
alert("Illegalformatofdigitnumber!");
return"";
}
//Normalizetheformatofinputdigits:
currencyDigits=currencyDigits.replace(/,/g,"");//Removecommadelimiters.
currencyDigits=currencyDigits.replace(/^0+/,"");//Trimzerosatthebeginning.
//Assertthenumberisnotgreaterthanthemaximumnumber.
if(Number(currencyDigits)>MAXIMUM_NUMBER){
alert("Toolargeanumbertoconvert!");
return"";
}
//http://www.knowsky.com/Processthecoversionfromcurrencydigitstocharacters:
//Separateintegralanddecimalpartsbeforeprocessingcoversion:
parts=currencyDigits.split(".");
if(parts.length>1){
integral=parts[0];
decimal=parts[1];
//Cutdownredundantdecimaldigitsthatareafterthesecond.
decimal=decimal.substr(0,2);
}
else{
integral=parts[0];
decimal="";
}
//Preparethecharacterscorrespondingtothedigits:
digits=newArray(CN_ZERO,CN_ONE,CN_TWO,CN_THREE,CN_FOUR,CN_FIVE,CN_SIX,CN_SEVEN,CN_EIGHT,CN_NINE);
radices=newArray("",CN_TEN,CN_HUNDRED,CN_THOUSAND);
bigRadices=newArray("",CN_TEN_THOUSAND,CN_HUNDRED_MILLION);
decimals=newArray(CN_TEN_CENT,CN_CENT);
//Startprocessing:
outputCharacters="";
//Processintegralpartifitislargerthan0:
if(Number(integral)>0){
zeroCount=0;
for(i=0;i<integral.length;i++){
p=integral.length-i-1;
d=integral.substr(i,1);
quotient=p/4;
modulus=p%4;
if(d=="0"){
zeroCount++;
}
else{
if(zeroCount>0)
{
outputCharacters+=digits[0];
}
zeroCount=0;
outputCharacters+=digits[Number(d)]+radices[modulus];
}
if(modulus==0&&zeroCount<4){
outputCharacters+=bigRadices[quotient];
}
}
outputCharacters+=CN_DOLLAR;
}
//Processdecimalpartifthereis:
if(decimal!=""){
for(i=0;i<decimal.length;i++){
d=decimal.substr(i,1);
if(d!="0"){
outputCharacters+=digits[Number(d)]+decimals[i];
}
}
}
//Confirmandreturnthefinaloutputstring:
if(outputCharacters==""){
outputCharacters=CN_ZERO+CN_DOLLAR;
}
if(decimal==""){
outputCharacters+=CN_INTEGER;
}
//outputCharacters=CN_SYMBOL+outputCharacters;
outputCharacters=outputCharacters;
returnoutputCharacters;
}//
varstmp="";
functionnst_convert(t)
{
if(t.value==stmp)return;//如果等于上次输入则返回
varms=t.value.replace(/[^\d\.]/g,"").replace(/(\.\d{2}).+$/,"$1").replace(/^0+([1-9])/,"$1").replace(/^0+$/,"0");
//replace(/[^\d\.]/g,"")去掉输入当中不是数字和.的字符
//replace(/(\.\d{2}).+$/,"$1")
//匹配从字符开始的第一个.后面的所有字符,由于没有使用g标记,
//所以只匹配开始第一次然后用小数点和后两位进行替换以确定数值最后的格式正确高.
//replace(/^0+([1-9])/,"$1")匹配以多个0开头的数值替换为去掉0后的数值做为数字的第一位也是匹配开始的一次.
//replace(/^0+$/,"0")匹配以0开始和结束的多个0为一个0也就是0000000输入->转换成一个0
//以下确定输入的为过滤后的合法数字
//alert(ms);
vartxt=ms.split(".");
//alert(txt[0]);
//如果ms值不小数点存在则txt[0]=小数点前的值否则等于ms
//regexp:/\d{4}(,|$)/匹配四位数字和,的集合或者四位数字和字符结尾的集合
while(/\d{4}(,|$)/.test(txt[0]))//如果为txt[0]=4123
txt[0]=txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2");
//txt[0].replace(/(\d)(\d{3}(,|$))/,"$1,$2")是将txt[0]进行替换后再赋给它
//regexp:/(\d)(\d{3}(,|$))/将四个数字份为两组第一个数字为第一位,后三位和其他结尾为每二位
//并替换成第一位,第二位注意,的使用很好.也就是将4123先替换成4,123
//由于此表达式默认采用贪婪匹配所以从数值后向前匹配再通过循环进行再匹配替换从而可以将
//12345678分成你想要的123,456,78彩用(,|$)很精典,因为它略去了第二次匹配时的,问题
t.value=stmp=txt[0]+(txt.length>1?"."+txt[1]:"");
//最终赋值到输入框中
//如果有小数点则加上并购成最终数字否则显示替换后的txt[0]
bbb.value=convertCurrency(ms-0);
//将ms转换为数字送到number2num1去转换
}
以上所述就是本文的全部内容了,希望大家能够喜欢。