JS實現一個數轉換成大寫數字

適用場景:票據,結算憑證等。
將任意數字的金額,轉換成漢字大寫的形式。
例如: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個小時寫出該方法,而後就分享一下啦。(寫的不怎麼好,歡迎吐糟!)前端

相關文章
相關標籤/搜索