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

时间:2014-08-11 03:26:29

标签: java delimiter

我试图从System.in读取这样的东西:hh:mm(例如:17:10,9:32等)

我还想将冒号前的数字存储到“hour”变量中,将后面的数字存储到“minute”变量中。到目前为止我的代码是这样的:

    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键入时的“分钟”:(注意第二个冒号)。

你能帮忙吗?

2 个答案:

答案 0 :(得分:1)

另一种方法是将线分开:

String[] timeParts = in.nextLine().split(":");

System.out.println("Hour is : " + timeParts[0]);
System.out.println("Minute is : " + timeParts[1]);

答案 1 :(得分:0)

考虑到您对我的评论给出的答案,我认为您正在使用 Windows

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


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

System.in              9:10\r\n
matching delimiters     ^    ^

令牌:

  • 9,可以强制为int
  • 10\r,但不能。

但是,使用:\r\n作为分隔符会产生以下结果:

System.in              9:10\r\n
matching delimiters     ^  ^

令牌:

  • 9
  • 10

......这两者都可以被强制转移到int


很容易检查。以下代码将显示从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换行 &#39; s(\n)一个:)


作为旁注,我想指出我在你的问题的评论中建议你的正则表达式(即::|\r?\n)将匹配{{ 1}}或:\r\n

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

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