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個小時寫出該方法,然后就分享一下啦。(寫的不怎么好,歡迎吐糟!)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM