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:有类似需求的可直接拿走用!
本文来自博客园,作者:泠雨0702,转载请注明原文链接:https://www.cnblogs.com/lingyu0702/p/19032141