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

标签 java

我是 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/

相关文章:

java - 如何将字符串 xml 转换为 Map<String,String>

java - Apache Flink-Java> 8支持路线图?

java - 尝试找出集合中的通用方法签名

java - 在java中使用分隔符按分隔符计数分割字符串

java - 从 View 中将空字符串作为 null 插入 MySQL DB 中

java - 跟踪音频(强度级别)- android/iphone

java - 如何使用 SDKMAN 更改 java 版本而不需要先关闭 Intellij IDEA?

java - 在swing组件中添加flash

java - 在java中处理文件中的数据更改时遇到问题

java - 使用 Retrofit 库的 NullPointerException - Android