JavaScript金额转英文单词:修复$10.20无法正确输出的问题
金额转英文单词代码修复
原代码无法正确处理$10.20这类含两位数美分的输入,核心问题是仅用长度为10的centsWords数组处理美分,只能识别0-9的单数美分,同时还存在单复数错误、冗余表述等问题。以下是修复后的代码:
function convertAmountToWords(amount) { const words = [ "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" ]; const tensWords = [ "", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" ]; // 通用函数:将0-99的数字转为英文单词 function numberToWords(num) { if (num === 0) return "Zero"; if (num < 20) return words[num]; const tens = Math.floor(num / 10); const units = num % 10; return units === 0 ? tensWords[tens] : `${tensWords[tens]} ${words[units]}`; } // 拆分美元和美分部分 const [dollarStr, centStr] = amount.slice(1).split("."); const dollarNum = Number(dollarStr); const centNum = centStr ? Number(centStr) : 0; // 处理美元部分单复数 const dollarWords = `${numberToWords(dollarNum)} ${dollarNum === 1 ? "Dollar" : "Dollars"}`; // 处理美分部分(仅当美分大于0时添加) let centPart = ""; if (centNum > 0) { centPart = ` and ${numberToWords(centNum)} ${centNum === 1 ? "Cent" : "Cents"}`; } return `${dollarWords}${centPart}`; } // 测试验证 console.log(convertAmountToWords("$10.20")); // 输出: "Ten Dollars and Twenty Cents" console.log(convertAmountToWords("$1.05")); // 输出: "One Dollar and Five Cents" console.log(convertAmountToWords("$0.99")); // 输出: "Zero Dollars and Ninety Nine Cents" console.log(convertAmountToWords("$5")); // 输出: "Five Dollars"
关键修改点
- 新增
numberToWords通用函数,统一处理0-99数字的转译逻辑,复用美元和美分的转换逻辑,避免重复代码。 - 移除原有限制性的
centsWords数组,支持两位数美分的正确转译(如20转为Twenty)。 - 增加单复数判断:金额为1时用单数(Dollar/Cent),否则用复数(Dollars/Cents)。
- 优化空美分场景:无小数部分或美分为0时,不输出多余的
and及空内容。 - 完善类型转换逻辑,确保字符串转数字的准确性。
内容的提问来源于stack exchange,提问作者wzhtoo
相关产品推荐
相关产品推荐

