数字转英文单词工具BUG:11-19输出均为Ten问题排查求助
修复数字转英文单词工具的11-19区间输出BUG
我帮你找到了问题的核心原因,也给出了修复后的完整代码,咱们一步步来看:
问题根源
你的代码中,actualnum是通过字符串分割得到的字符串数组(比如输入15时,actualnum是['5','1']),但在test()函数里,你用了严格相等(===)和数字0、1比较,字符串和数字严格相等永远为false,导致11-19区间的数字永远不会触发ePlace的逻辑,反而走到tensPlace['1']输出'Ten'。
另外还有几处小问题需要调整:
- 数组初始化
var inWords = [];重复声明了两次 - 部分判断里的数字比较也存在字符串/数字混淆的情况
- 处理千位、 lakh、 crore时的逻辑可以更严谨
修复后的完整代码
<script> var iWords = ['Zero', ' One', ' Two', ' Three', ' Four', ' Five', ' Six', ' Seven', ' Eight', ' Nine']; var ePlace = ['Ten', ' Eleven', ' Twelve', ' Thirteen', ' Fourteen', ' Fifteen', ' Sixteen', ' Seventeen', ' Eighteen', ' Nineteen']; var tensPlace = ['', ' Ten', ' Twenty', ' Thirty', ' Forty', ' Fifty', ' Sixty', ' Seventy', ' Eighty', ' Ninety']; var inWords = []; var numReversed, actualnum, i, j; function test() { 'use strict'; // 修复:把字符串转成数字再比较,避免类型不匹配 const currentDigit = Number(actualnum[i]); const prevDigit = Number(actualnum[i - 1]); if (currentDigit === 0) { inWords[j] = ''; } else if (currentDigit === 1) { inWords[j] = ePlace[prevDigit]; } else { inWords[j] = tensPlace[currentDigit]; } } function testSkill() { 'use strict'; var junkVal = document.getElementById('vals').value; junkVal = Math.floor(junkVal); // 新增:处理非数字输入的情况 if (isNaN(junkVal)) { window.alert('请输入有效的数字'); return false; } var obStr = junkVal.toString(); numReversed = obStr.split(''); actualnum = numReversed.reverse(); if (junkVal < 0) { window.alert('负数无法转换,请输入非负整数'); return false; } if (junkVal === 0) { document.getElementById('container').innerHTML = `${obStr} Zero`; return false; } if (actualnum.length > 9) { window.alert('数字过大,无法转换'); return false; } var iWordsLength = numReversed.length; var finalWord = ''; j = 0; for (i = 0; i < iWordsLength; i++) { // 提前转成数字,避免重复转换 const currentDigit = Number(actualnum[i]); const nextDigit = i+1 < iWordsLength ? Number(actualnum[i+1]) : null; switch (i) { case 0: if (currentDigit === 0 || nextDigit === 1) { inWords[j] = ''; } else { inWords[j] = iWords[currentDigit]; } inWords[j] = inWords[j] + ' '; break; case 1: test(); break; case 2: if (currentDigit === 0) { inWords[j] = ''; } else { const hasLowerDigits = Number(actualnum[i-1]) !== 0 || Number(actualnum[i-2]) !== 0; inWords[j] = `${iWords[currentDigit]} Hundred${hasLowerDigits ? ' and' : ''}`; } break; case 3: if (currentDigit === 0 || nextDigit === 1) { inWords[j] = ''; } else { inWords[j] = iWords[currentDigit]; } if (nextDigit !== 0 || currentDigit > 0) { inWords[j] = `${inWords[j]} Thousand`; } break; case 4: test(); break; case 5: if (currentDigit === 0 || nextDigit === 1) { inWords[j] = ''; } else { inWords[j] = iWords[currentDigit]; } if (nextDigit !== 0 || currentDigit > 0) { inWords[j] = `${inWords[j]} Lakh`; } break; case 6: test(); break; case 7: if (currentDigit === 0 || nextDigit === 1) { inWords[j] = ''; } else { inWords[j] = iWords[currentDigit]; } inWords[j] = `${inWords[j]} Crore`; break; case 8: test(); break; default: break; } j++; } inWords.reverse(); // 过滤空字符串,避免输出多余空格 finalWord = inWords.filter(word => word.trim() !== '').join(' '); document.getElementById('container').innerHTML = `${obStr} ${finalWord}`; } </script>
关键修改点说明
- 修复字符串/数字比较问题:在
test()函数和循环中,把actualnum的元素转成数字后再进行比较,避免严格相等的类型不匹配。 - 去除重复变量声明:删除了重复的
var inWords, actualnum, i, j;声明。 - 增加非数字输入校验:加入
isNaN判断,处理用户输入非数字的情况。 - 优化字符串拼接:使用模板字符串让代码更易读,同时过滤空字符串,避免输出多余空格。
- 严谨性提升:处理
i+1超出数组长度的情况,防止获取undefined导致的错误。
测试验证
- 输入15 → 输出
15 Fifteen - 输入11 → 输出
11 Eleven - 输入20 → 输出
20 Twenty - 输入123 → 输出
123 One Hundred and Twenty Three
内容的提问来源于stack exchange,提问作者Brook
相关产品推荐
相关产品推荐

