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

Java程序求助:0-999数字转英文单词时111-119等区间转换错误

解决111-119等区间数字转英文单词的问题

我来帮你搞定这个数字转英文的bug!你的问题核心在于没有处理11-19这类特殊的复合数字——这些数字不能拆成十位+个位单独拼接,得作为一个整体来匹配对应的英文单词。

问题根源分析

你当前的代码把百位之后的数字拆成了tens和ones两部分单独处理,但像11、15、19这类数字是固定的复合词(eleven、fifteen、nineteen),不能拆成"ten one"或者"fif teen"。之前你尝试把numones = number%10改成number%100,但没加范围判断,当后两位超过20时(比如21),你的ones数组只到索引20,自然会触发数组越界错误。

修正方案

我们需要先提取百位之后的最后两位数字,然后判断这两位是否在11-19之间:

  • 如果是:直接用这两位作为索引取ones数组里的对应单词
  • 如果不是:再拆成十位和个位,分别匹配tens和ones数组

另外,你原来判断整百的代码可以简化,不用逐个列举100、200...900,只需要判断最后两位是否为0即可。

修正后的完整代码

import java.util.Scanner;

public class NumberToWords {
    public static void main(String[] args) {
        Scanner In = new Scanner(System.in);
        String[] ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", 
                         "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", 
                         "seventeen", "eighteen", "nineteen"};
        String[] tens = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
        
        System.out.print("Number: ");
        int number = In.nextInt();
        
        while (number != -1) {
            if (number >= 100 && number <= 999) {
                int numHundreds = number / 100;
                int numLastTwo = number % 100; // 提取百位后的最后两位
                
                if (numLastTwo == 0) {
                    // 处理整百的情况
                    System.out.println(ones[numHundreds] + " hundred");
                } else {
                    String lastPart;
                    if (numLastTwo >= 11 && numLastTwo <= 19) {
                        // 处理11-19的特殊情况
                        lastPart = ones[numLastTwo];
                    } else {
                        // 拆分十位和个位
                        int numTens = numLastTwo / 10;
                        int numOnes = numLastTwo % 10;
                        // 处理个位为0的情况(比如220不要输出"twenty ")
                        lastPart = tens[numTens];
                        if (numOnes != 0) {
                            lastPart += " " + ones[numOnes];
                        }
                    }
                    System.out.println(ones[numHundreds] + " hundred and " + lastPart);
                }
            }
            // 继续输入下一个数字
            System.out.print("Number: ");
            number = In.nextInt();
        }
        In.close();
    }
}

测试验证

  • 输入111,输出:one hundred and eleven(正确)
  • 输入215,输出:two hundred and fifteen(正确)
  • 输入320,输出:three hundred and twenty(正确,不会多一个空格)
  • 输入500,输出:five hundred(正确)

这样修改后,所有0-999的数字都能正确转换了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:44:28