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
相关产品推荐
相关产品推荐

