适用场景:票据,结算凭证等。
将任意数字的金额,转换成汉字大写的形式。
例如:1234.50 -> 壹仟贰佰叁拾肆圆伍角。
壹、贰、叁、肆
1 //把小数前的数分成4位处理,不足位添0,例如:123456 => 0012,3456 2 if (!Number.prototype.cutNum) { 3 Number.prototype.cutNum = function () { //判断Number对象是否有cutNum方法 4 let num = '' + this; //this指需要转换的数,然后由number类型转为string类型 5 let len = Math.ceil(num.length/4); 6 let arr = []; 7 let v_len = num.length; 8 while (len > 0){ 9 let cut_start = v_len -4 > 0 ? v_len-4 : 0; 10 let cut_len = v_len -4 > 0 ? 4: v_len; 11 let v = num.substr(cut_start,cut_len); 12 if(v.length != 4){ 13 arr.push('0'.repeat(4 - v.length) + v); 14 }else{ 15 arr.push(v); 16 } 17 len--; 18 v_len -= 4; 19 } 20 return arr.length != 1 ? arr.reverse().join(',') : '' + arr; 21 } 22 } 23 if (!Number.prototype.numToChinese) { 24 Number.prototype.numToChinese = function () { 25 //有小数点的分为两部分:小数前的数firstPart和小数后的数secondPart,小数前的数进行cutNum方法处理 26 //如果小数前的数不足4位,添0补位 27 let $this = '' + this, 28 firstPart = '', 29 secondPart = ''; 30 if(/./.test($this)){ 31 let arrPre = $this.split('.'); 32 firstPart = arrPre[0]; 33 if(firstPart.length > 12){ 34 return '数字不能超过仟亿'; 35 } 36 secondPart = arrPre[1]; 37 if(secondPart.length > 2){ 38 return '小数点后的数字不能超过2位'; 39 } 40 }else{ 41 firstPart = $this; 42 } 43 //第一部分:处理小数前的数 44 let firstPartArr = []; 45 if(firstPart.length > 4){ 46 firstPartArr = parseInt(firstPart).cutNum().split(','); //firstPart是字符串类型 47 }else { 48 firstPartArr = firstPartArr.concat('0'.repeat(4-firstPart.length) + firstPart); 49 } 50 const arrMap = [['0','零'],['1','壹'],['2','贰'],['3','叁'],['4','肆'], 51 ['5','伍'], ['6','陆'],['7','柒'],['8','捌'],['9','玖']], 52 unit = ['仟','佰','拾','']; 53 let map = new Map(arrMap), //创建Map对象 54 splitAddUnit = [], //存放4位分割后的单位 55 returnArr = []; //最终返回的值 56 if(firstPartArr.length == 3){ 57 splitAddUnit = ['亿','万']; 58 }else if(firstPartArr.length == 2){ 59 splitAddUnit = ['万']; 60 }else{ 61 splitAddUnit = ['']; 62 } 63 for(let k = 0; k < firstPartArr.length; k++){ 64 for(let j = 0; j < firstPartArr[k].length; j++){ 65 if(firstPartArr[k][j] != 0){ 66 //利用Map对象映射相应的值 67 returnArr.push(map.get(firstPartArr[k][j]) + unit[j]); 68 } 69 } 70 if(splitAddUnit[k]){ 71 returnArr.push(splitAddUnit[k]); 72 } 73 } 74 returnArr.push('元'); 75 //第二部分:处理小数后的数 76 if(secondPart){ 77 if(/^0+$/.test(secondPart)){ //小数后的数全为0时 78 returnArr.push('整'); 79 }else{ 80 const pointAfterUnit = ['角','分']; 81 for(let j = 0; j < secondPart.length; j++){ 82 let val = map.get(secondPart[j]) + pointAfterUnit[j]; 83 returnArr.push(val); 84 } 85 } 86 }else{ 87 returnArr.push('整'); 88 } 89 return returnArr.join(''); 90 } 91 } 92 (1234660.12).numToChinese(); //number类型需要加圆括号
这题来源于一个前端交流群(328336346,此群风气正,管理赞,推荐),开始花了半个小时写,发现比想象的难,放弃还是坚持?犹豫了一会儿,选择苦逼的想思路吧,后来想起上一篇文章“JS实现千位分隔符”能用上场了,前前后后花了4个小时写出该方法,然后就分享一下啦。(写的不怎么好,欢迎吐糟!)