gpt4 book ai didi

java - 如何将数字拆分为数字字符串?

转载 作者:行者123 更新时间:2023-11-29 07:49:28 25 4
gpt4 key购买 nike

我是 java 编程的新手,我尝试了一个示例代码来输入一个两位数并打印该数字的措辞。

public class ReadNumberInWord {

public Integer number;

public ReadNumberInWord() {
Scanner userInput = new Scanner(System.in);
System.out.println("Enter the number to read out : ");

try {
number = userInput.nextInt();
readNumber();
} catch (Exception e) {
System.out.println("Please enter an integer");
new ReadNumberInWord();
}
}

public void readNumber() {
System.out.println("Entered number is : " + number);
int numSize = number.toString().length();
System.out.println("number size is : " + numSize);

switch (numSize) {
case 1:
sizeOne();
break;
case 2:
sizeTwo();
break;
case 3:
sizeThree();
break;
case 4:
sizeFour();
break;
default:
System.out.println("Enter number of four digit or less ");
new ReadNumberInWord();
break;
}
}

private void sizeFour() {
System.out.println("Number in words : " + numberCheck(number.toString()));
}

private void sizeThree() {
String[] sizeThree = number.toString().split("");
System.out.println(sizeThree[0]);
System.out.println(sizeThree[1]);
System.out.println(sizeThree[2]);

for (int i = 0; i <= sizeThree.length - 1; i++) {
System.out.println(sizeThree[i]);
}

System.out.println("Number in words : " + numberCheck(number.toString()));
}

private void sizeTwo() {
String[] sizeTwo = number.toString().split("");
//System.out.println(sizeTwo[0]);
//System.out.println(sizeTwo[1]);
String wordsString1 = "";
ArrayList<String> wordsArray = new ArrayList<String>();
for (int i = 0; i <= sizeTwo.length - 1; i++) {
System.out.println(sizeTwo[i]);
String words = numberCheck(sizeTwo[i]);
wordsArray.add(words);
}

for (String w : wordsArray) {
wordsString1 += w + "\t";
}
System.out.println("Number in words : " + wordsString1);
}

private void sizeOne() {
System.out.println("Number in words : " + numberCheck(number.toString()));
}

public String numberCheck(String numb) {
int num = Integer.parseInt(numb);
switch (num) {
case 0:
return "zero";
case 1:
return "one";
case 2:
return "two";
case 3:
return "three";
case 4:
return "four";
case 5:
return "five";
case 6:
return "six";
case 7:
return "seven";
case 8:
return "eight";
case 9:
return "nine";
case 10:
return "ten";
default:
return "unknown";
}
}

public static void main(String[] args) {
new ReadNumberInWord();
}
}

在上面的代码中,如果我输入两位数字 78,它应该打印出七八。但是,这在这里不起作用。相反,我得到了异常(exception)。请帮助我修复它。

最佳答案

堆栈跟踪在调试时是非常有用的信息,如果您遇到意外异常但忽略堆栈跟踪,则您将忽略此信息。如果您打印了异常的堆栈跟踪,您会看到:

Enter the number to read out : 
78
Entered number is : 78
number size is : 2

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at ReadNumberInWord.numberCheck(ReadNumberInWord.java:74)
at ReadNumberInWord.sizeTwo(ReadNumberInWord.java:58)
at ReadNumberInWord.readNumber(ReadNumberInWord.java:26)
at ReadNumberInWord.<init>(ReadNumberInWord.java:13)
at ReadNumberInWord.main(ReadNumberInWord.java:94)

这清楚地表明 Integer.parseInt() 正在通过 numberCheck() 调用,并使用空字符串 "" 进行输入,这不是一个有效的整数并导致 Integer.parseInt() 抛出您看到的异常。

现在您需要找出发生这种情况的原因。您知道传递给 parseInt() 的字符串直接来自 numberCheck() 的参数,所以这意味着 numberCheck() 被传递给一个空字符串。因为您知道输入来自 sizeTwo() 中的 sizeTwo 数组,所以一个好的开始是打印该数组的内容:

System.out.println(Arrays.toString(sizeTwo));

这样做,你会看到:

[ , 7, 8 ]

第一个空元素是一个提示。以这种方式使用拆分不太正确,从技术上讲,输入字符串以“空”字符串开头,您最终会得到它(例如拆分 ":7:8" on :)。您必须让 numberCheck() 忽略空字符串,或者找到另一种方法将字符串拆分为数字。前者是解决问题根本原因的创可贴(请记住:在数字列表中包含任何空字符串并不是您的实际意图),因此我们将重点关注后者。

一种选择是将数字转换为 String(跳过 String[] 部分),然后转换为 char 数组,例如:

char[] digits = number.toString().toCharArray();

然后您可以使用 char 而不是 String。另一种选择是在循环中使用 substring(),例如:

String numberstr = number.toString();

for (int n = 0; n < numberstr.length(); ++ n) {
String digit = number.substring(n, 1);
...
}

当然,这个字符串中间人并不是必须的,你可以用算术来实现:

for (int n = (int)Math.log10(number); n >= 0; -- n) {
int digit = (number / (int)Math.pow(10, n)) % 10;
System.out.println(digit);
}

或者相反但不依赖浮点计算:

int temp = number;

while (temp) {
digit = temp % 10;
temp /= 10;
System.out.println(digit);
}

您的代码可以通过许多其他方式进行清理和大大简化(例如,正如 Richard Miskin 在评论中暗示的那样,您真的需要一个已解析的 int 吗?),但我认为以上内容涵盖了您当前问题的根源。


至于错误处理本身,我建议只使用 Scanner.next() 读取一个字符串,然后你可以使用 Integer.parseInt() 来解析它如果您看到 NumberFormatException,请再次询问。这将是对异常的适当使用,并且使用 next() 而不是 nextInt() 会将 token 从流中拉出,即使它是一个无效的 int (让你继续要求输入)。例如:

Scanner userInput = new Scanner(System.in);
System.out.println("Enter the number to read out : ");

while (true) {
try {
number = Integer.parseInt(userInput.next());
break;
} catch (NumberFormatException x) {
System.out.println("Please enter a valid integer");
}
};

注意这里的几个关键概念:

  • 尽可能捕获最窄的异常(即 NumberFormatException,而不是 Exception)。这是有道理的,因为:NumberFormatException 是我们试图处理的唯一问题。
  • 异常处理程序通常应该尝试恢复;否则处理它们是没有意义的。在这种情况下,我们的恢复尝试是通知用户出现问题并要求新的有效输入。

您当前的实现设置了一个递归堆栈并存在一些其他问题。

关于java - 如何将数字拆分为数字字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22438495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com