以带有分隔符的 hh:mm 格式读取 System.in



我试图从 System.in 中读取类似以下内容:hh:mm(例如:17:10,9:32等(

我还想将冒号之前的数字存储到"小时"变量

中,将冒号之后的数字存储到"分钟"变量中。到目前为止,我的代码是这样的:

    import java.util.Scanner;
    Scanner in = new Scanner(System.in);
    in.useDelimiter(":|\n");
    int hour = 0, minute = 0;
    while (in.hasNext()){
            hour = in.nextInt();
            minute = in.nextInt();
            System.out.println("Hour is : " + hour);
            System.out.println("Minute is : " + minute);
        }

但是,当我运行它并输入"9:10"然后按 ENTER 例如时,我得到了这个:

    Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)

如果我把这个改为:

    in.useDelimiter(":");
然后它只读取第一个数字(">

小时"(,它只读取第二个数字(我键入 9:10 时的"分钟":(注意第二个冒号(。

你们能帮忙吗?

另一种方法是像这样拆分行:

String[] timeParts = in.nextLine().split(":");
System.out.println("Hour is : " + timeParts[0]);
System.out.println("Minute is : " + timeParts[1]);

考虑到你对我的评论给出的答案,我假设你使用的是Windows

当你按 Enter 时,你的系统实际上会向System.in发送两个字节:不仅n,而且实际上r然后n


因此,当您使用 n: 作为分隔符时,会发生以下情况:

System.in              9:10rn
matching delimiters     ^    ^

令 牌:

  • 9,可以胁迫到int
  • 10r,这不能。

但是,使用 :rn 作为分隔符会导致以下结果:

System.in              9:10rn
matching delimiters     ^  ^

令 牌:

  • 9
  • 10

。这两者都可以被胁迫到int S。


检查起来很容易。以下代码段将显示从System.in读取的每个字符的 ASCII 值:

final Scanner in = new Scanner(System.in);
in.useDelimiter("");
while (in.hasNext()){
    final String next = in.next();
    for(int i = 0; i < next.length(); i++) {
        System.out.println(next.codePointAt(i));
    }
}

当您执行此操作并简单地在控制台中按 Enter 键时,您应该得到:

13
10

。其中13回车符(r(的ASCII十进制值,10换行符(n(的一个:)


作为旁注,我想指出,我在问题的评论中建议您的正则表达式(即::|r?n(将与:rnn匹配。

因此,它也适用于Linux,例如:)

我希望这个彻底的解释回答了你的问题!

最新更新