陈建华的博客
专注web开发
js实现完美兼容各大浏览器的人民币大小写相互转换
2016-04-18 17:10:31   阅读1158次

在基于网页的打印输出或报表中,经常会牵扯到金额的大写,每次都打上去很麻烦,所以想法用一个JavaScript客户端脚本来实现自动转换,只需在需要显示大写金额的时候调用该JS函数,下面我们就来汇总下吧

/*小写转大写*/
var xcc= "12.22";document.write(xcc+"=>"+formatRMB(xcc)+"<br/>");
/*大写转小写*/
var rrrr = "壹拾贰元贰角贰分";document.write(rrrr+"=>"+parseRMB(rrrr));

输出结果:
12.22=>壹拾贰元贰角贰分
壹拾贰元贰角贰分=>12.22

我们来看下具体实例

var c = "零壹贰叁肆伍陆柒捌玖".split("");
// ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
var _c = {}; // 反向对应关系
for ( var i = 0; i < c.length; i++) {
 _c[c[i]] = i;
};
var d = "元***万***亿***万";
var e = ",拾,佰,仟".split(",");
function unit4(arr) {
 var str = "", i = 0;
 while (arr.length) {
   var t = arr.pop();
   str = (c[t] + (t == 0 ? "" : e[i])) + str;
   i++;
 }
 str = str.replace(/[零]{2,}/g, "零");
 str = str.replace(/^[零]/, "");
 str = str.replace(/[零]$/, "");
 if (str.indexOf("零") == 0) {
   str = str.substring(1);
 }
 if (str.lastIndexOf("零") == str.length - 1) {
   str = str.substring(0, str.length - 1);
 }
 return str;
}
function _formatD(a) {
 // 转化整数部分
 var arr = a.split(""), i = 0, result = "";
 while (arr.length) {
   var arr1 = arr.splice(-4, 4);
   var dw = d.charAt(i), unit = unit4(arr1);
   if (dw == '万' && !unit) {
     dw = "";
   }
   result = unit + dw + result;
   i += 4;
 }
 return result == "元" ? "" : result;
}
function _formatF(b){
  // 转化小数部分
 b = b || "";
 switch (b.length) {
 case 0:
   return "整";
 case 1:
   return c[b] + "角";
 default:
   return c[b.charAt(0)] + "角" + c[b.charAt(1)] + "分";
 }
}
function _format(n){
 var a = ("" + n).split("."), a0 = a[0], a1 = a[1];
 return _formatD(a0) + _formatF(a1);
}
function parse4(u4){
 var res = 0;
 while (t = /([零壹贰叁肆伍陆柒捌玖])([拾佰仟]?)/g.exec(u4)) {
   var n = _c[t[1]], d = {
     "" : 1,
     "拾" : 10,
     "佰" : 100,
     "仟" : 1000
   }[t[2]];
   res += n * d;
   u4 = u4.replace(t[0], "");
 }
 var result = ("0000" + res);
 return result.substring(result.length - 4);
}
function _parseD(d) {
 var arr = d.replace(/[零]/g, "").split(/[万亿]/), rs = "";
 for ( var i = 0; i < arr.length; i++) {
   rs += parse4(arr[i]);
 }
 ;
 return rs.replace(/^[0]+/, "");
};
function _parseF(f) {
 var res = "", t = f.replace(/[^零壹贰叁肆伍陆柒捌玖]+/g, "").split(""); // 去掉单位
 if (t.length) {
   res = ".";
 } else {
   return "";
 }
 ;
 for ( var i = 0; (i < t.length && i < 2); i++) {
   res += _c[t[i]];
 }
 ;
 return res;
};
function _parse(rmb) {
 var a = rmb.split("元"), a1 = a[1], a0 = a[0];
 if (a.length == 1) {
   a1 = a0;
   a0 = "";
 }
 return _parseD(a0) + _parseF(a1);
};
//小写转大写
function formatRMB(num){
 var n = Number(num);
 if(!isNaN(num)){
   if(num == 0){
     return "零元整";
   }else{
     return _format(n);
   }
 }else {
   return false;
 }
}
//大写转小写
function parseRMB(rmb) {
 if (/^[零壹贰叁肆伍陆柒捌玖元万亿拾佰仟角分整]{2,}$/.test(rmb)) {
   var result = _parse(rmb);
   return rmb == this.formatRMB(result) ? result : result + "(?)";
 } else {
   return false;
 }
};


/*小写转大写*/

var xcc= "12.22";
document.write(xcc+"=>"+formatRMB(xcc)+"<br/>");



/*大写转小写*/

var rrrr = "壹拾贰元贰角贰分";
document.write(rrrr+"=>"+parseRMB(rrrr));


再来看一个将RMB转化为大写的例子

//人民币金额转大写程序 JavaScript版
 function numToCny(num){
 var capUnit = ['万','亿','万','圆',''];
 var capDigit = { 2:['角','分',''], 4:['仟','佰','拾','']};
 var capNum=['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];
 if (((num.toString()).indexOf('.') > 16)||(isNaN(num)))
 return '';
 num = (Math.round(num*100)/100).toString();
 num =((Math.pow(10,19-num.length)).toString()).substring(1)+num;
 var i,ret,j,nodeNum,k,subret,len,subChr,CurChr=[];
 for (i=0,ret='';i<5;i++,j=i*4+Math.floor(i/4)){
 nodeNum=num.substring(j,j+4);
 for(k=0,subret='',len=nodeNum.length;((k
 CurChr[k%2] = capNum[nodeNum.charAt(k)]+((nodeNum.charAt(k)==0)?'':capDigit[len][k]);
 if (!((CurChr[0]==CurChr[1]) && (CurChr[0]==capNum[0])))
 if(!((CurChr[k%2] == capNum[0]) && (subret=='') && (ret=='')))
 subret += CurChr[k%2];
 }
 subChr = subret + ((subret=='')?'':capUnit[i]);
 if(!((subChr == capNum[0]) && (ret=='')))
 ret += subChr;
 }
 ret=(ret=='')? capNum[0]+capUnit[3]: ret;
 return ret;
 }




-----------------------------------------------------
转载请注明来源此处
原地址:#

-----网友评论----
1楼:xiaozl 发表于 2016-11-20 02:26:01
这个不就是在panCNY.js里面的方法吗
-----发表评论----
微网聚博客乐园 ©2014 blog.mn886.net 鲁ICP备14012923号   网站导航