JS中对输入的金额进行大写转换(支持两位小数)

项目中涉及金额处理时,常常需要将输入的金额转换为中文,因此需要进行数字和中文金额转换,找了好多个都报错,懒得写就用豆包生成了一下js版的转换函数,测试可用,因此分享出来,代码如下:

 1 function numberToChineseAmount(num) {
 2     // 处理无效输入
 3     if (isNaN(num) || num === null || num === undefined) {
 4         return "无效金额";
 5     }
 6     
 7     // 转换为字符串并处理负数
 8     let numStr = num.toString();
 9     let isNegative = false;
10     if (numStr.startsWith('-')) {
11         isNegative = true;
12         numStr = numStr.slice(1);
13     }
14     
15     // 分割整数和小数部分
16     let parts = numStr.split('.');
17     let integerPart = parts[0] || '0';
18     let decimalPart = parts[1] ? parts[1].slice(0, 2) : ''; // 只取两位小数
19     
20     // 中文数字映射
21     const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'];
22     // 单位映射
23     const units = ['', '拾', '佰', '仟', '万', '拾', '佰', '仟', '亿', '拾', '佰', '仟'];
24     // 小数单位
25     const decimalUnits = ['角', '分'];
26     
27     // 处理整数部分
28     let chineseInteger = '';
29     for (let i = 0; i < integerPart.length; i++) {
30         const digit = parseInt(integerPart[i]);
31         const position = integerPart.length - 1 - i;
32         
33         if (digit !== 0) {
34             chineseInteger += digits[digit] + units[position];
35         } else {
36             // 处理零的情况,避免连续多个零
37             if (position % 4 !== 0 || chineseInteger.slice(-1) !== '零') {
38                 chineseInteger += digits[digit];
39             }
40             
41             // 处理单位(万、亿)
42             if (position === 4 || position === 8) {
43                 chineseInteger += units[position];
44             }
45         }
46     }
47     
48     // 去除末尾的零
49     chineseInteger = chineseInteger.replace(/零+$/, '');
50     // 如果整数部分为空,设置为零
51     if (chineseInteger === '') {
52         chineseInteger = '零';
53     }
54     
55     // 添加"元"
56     chineseInteger += '元';
57     
58     // 处理小数部分
59     let chineseDecimal = '';
60     if (decimalPart.length > 0) {
61         for (let i = 0; i < decimalPart.length; i++) {
62             const digit = parseInt(decimalPart[i]);
63             if (digit !== 0) {
64                 chineseDecimal += digits[digit] + decimalUnits[i];
65             } else if (i === 0 && decimalPart.length > 1 && parseInt(decimalPart[1]) !== 0) {
66                 // 如果角为零但分为非零,保留零
67                 chineseDecimal += digits[digit];
68             }
69         }
70     }
71     
72     // 如果没有小数部分或小数部分全为零,添加"整"
73     if (chineseDecimal === '') {
74         chineseDecimal = '整';
75     }
76     
77     // 组合结果
78     let result = chineseInteger + chineseDecimal;
79     
80     // 处理负数
81     if (isNegative) {
82         result = '负' + result;
83     }
84     
85     return result;
86 }
87 
88 // 测试示例
89 console.log(numberToChineseAmount(0)); // 零元整
90 console.log(numberToChineseAmount(123.45)); // 壹佰贰拾叁元肆角伍分
91 console.log(numberToChineseAmount(1000000.01)); // 壹佰万元零壹分
92 console.log(numberToChineseAmount(987654321.98)); // 玖亿捌仟柒佰陆拾伍万肆仟叁佰贰拾壹元玖角捌分
93 console.log(numberToChineseAmount(-1234.56)); // 负壹仟贰佰叁拾肆元伍角陆分

PS:有类似需求的可直接拿走用!

posted @ 2025-08-11 15:57  泠雨0702  阅读(94)  评论(0)    收藏  举报