You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数字转英文单词工具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>

关键修改点说明

  1. 修复字符串/数字比较问题:在test()函数和循环中,把actualnum的元素转成数字后再进行比较,避免严格相等的类型不匹配。
  2. 去除重复变量声明:删除了重复的var inWords, actualnum, i, j;声明。
  3. 增加非数字输入校验:加入isNaN判断,处理用户输入非数字的情况。
  4. 优化字符串拼接:使用模板字符串让代码更易读,同时过滤空字符串,避免输出多余空格。
  5. 严谨性提升:处理i+1超出数组长度的情况,防止获取undefined导致的错误。

测试验证

  • 输入15 → 输出15 Fifteen
  • 输入11 → 输出11 Eleven
  • 输入20 → 输出20 Twenty
  • 输入123 → 输出123 One Hundred and Twenty Three

内容的提问来源于stack exchange,提问作者Brook

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:59:04