Java 如何将数字拆分为数字字符串?

Java 如何将数字拆分为数字字符串?,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 : ");

我是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();
    }
}
公共类ReadNumberInWord{
公共整数;
公共ReadNumberInWord(){
扫描仪用户输入=新扫描仪(System.in);
System.out.println(“输入要读取的数字:”);
试一试{
number=userInput.nextInt();
readNumber();
}捕获(例外e){
System.out.println(“请输入一个整数”);
新ReadNumberInWord();
}
}
公共无效readNumber(){
System.out.println(“输入的编号为:“+编号”);
int numSize=number.toString().length();
System.out.println(“数字大小为:“+numize”);
开关(numSize){
案例1:
sizeOne();
打破
案例2:
sizewo();
打破
案例3:
sizeThree();
打破
案例4:
sizeFour();
打破
违约:
System.out.println(“输入四位数或更少的数字”);
新ReadNumberInWord();
打破
}
}
私人空间大小{
System.out.println(“大写数字:+numberCheck(Number.toString()));
}
私有void sizeThree(){
字符串[]sizeThree=number.toString().split(“”);
System.out.println(sizeThree[0]);
System.out.println(sizeThree[1]);
System.out.println(sizeThree[2]);
对于(int i=0;i而言,问题在于:

String[] sizeTwo=number.toString().split("");
当数字为“78”时,它生成数组[“”、“7”、“8”],而不是[“7”、“8”]。 您应该以不同的方式将字符串拆分为数字(或者忽略第一个始终为空字符串的标记)

split(..)接受一个正则表达式,该表达式指定哪些模式被视为令牌分隔符。在您的例子中,我发现以下正则表达式很有用:

String[] sizeTwo=number.toString().split("(?<=\\d)(?=\\d)");
String[]sizewo=number.toString().split((?问题在于:

String[] sizeTwo=number.toString().split("");
当数字为“78”时,它生成数组[“”、“7”、“8”],而不是[“7”、“8”]。 您应该以不同的方式将字符串拆分为数字(或者忽略第一个始终为空字符串的标记)

split(..)接受一个正则表达式,该表达式指定哪些模式被视为令牌分隔符。在您的例子中,我发现以下正则表达式很有用:

String[] sizeTwo=number.toString().split("(?<=\\d)(?=\\d)");
String[]sizeTwo=number.toString().split((?堆栈跟踪在调试时是非常有用的信息,如果遇到意外异常但忽略堆栈跟踪,则忽略此信息。如果您打印了异常的堆栈跟踪,您会看到以下情况:

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)
这样做,您将看到:

[ , 7, 8 ]
第一个空元素是一个提示。以这种方式使用拆分并不完全正确,从技术上讲,输入字符串以一个“空”字符串开始,然后您最终得到它(例如,在
上拆分
:7:8“
)。您必须进行
numberCheck()忽略空字符串,或者找到另一种方法将字符串拆分为数字。前者是一个带助于解决问题的根本原因(记住:在数字列表中不包括任何空字符串),所以我们将重点放在后者。
一个选项是将数字转换为
字符串
(跳过
字符串[]
项),然后转换为
字符
数组,例如:

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);
   ...
}
或相反,但不依赖浮点计算:

int temp = number;

while (temp) {
    digit = temp % 10;
    temp /= 10;
    System.out.println(digit);
}
您的代码可以通过许多其他方式进行清理和大大简化(例如,Richard Miskin在评论中暗示,您真的需要解析的
int
吗?),但我认为以上内容涵盖了您当前问题的根源


至于错误处理本身,我建议只使用
Scanner.next()
来读取字符串,然后可以使用
Integer.parseInt()
来解析它,如果您看到
NumberFormatException
,请再次询问。这将是对异常的适当使用,并使用
next()
而不是
nextInt()
即使是无效的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是我们试图处理的唯一问题
  • 异常处理程序通常应该尝试恢复;否则处理它们就没有意义了。在这种情况下,我们的恢复尝试是通知用户出现了问题,并请求新的有效输入
您当前的实现设置了递归堆栈,并存在一些其他问题。

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

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)
这样做,您将看到:

[ , 7, 8 ]
第一个空元素是一个提示。以这种方式使用拆分并不完全正确,从技术上讲,输入字符串以一个“空”字符串开始,然后您最终得到它(例如,在
上拆分
:7:8“
)。您必须进行
numberCheck()忽略空字符串,或者找到另一种方法将字符串拆分为数字。前者是一个带助于解决问题的根本原因(记住:在数字列表中不包括任何空字符串),所以我们将重点放在后者。
一个选项是将数字转换为
字符串
(跳过
字符串[]
thi