我有如下因素代码:parseDouble VS nextDouble
Scanner in = new Scanner(System.in);
while (in.hasNextDouble()) {
System.out.println(Double.parseDouble(in.nextLine()));
}
与输入:阅读此输入,而之后
1.1
2.2
3.3
程序停止,因为我认为,它应该仍然输入读取。 这是为什么?
我有如下因素代码:parseDouble VS nextDouble
Scanner in = new Scanner(System.in);
while (in.hasNextDouble()) {
System.out.println(Double.parseDouble(in.nextLine()));
}
与输入:阅读此输入,而之后
1.1
2.2
3.3
程序停止,因为我认为,它应该仍然输入读取。 这是为什么?
问题可能是您的默认语言环境使用逗号作为分隔符。
Double.parseDouble() - 始终使用点作为分隔符。
in.nextDouble() - 使用您的Locale指定的分隔符。
结果是,其中一种方法可以使用逗号作为分隔符,而另一种使用点。
要解决这个问题,您应该统一从输入中读取/解析双精度的方法,并且还要决定要使用哪个分隔符。
可以通过使用设置分离器的类型,例如:
1. 点定界符:
Scanner in = new Scanner(System.in);
in.useLocale(Locale.ENGLISH);
或:
Scanner in = new Scanner(System.in);
in.useDelimiter("\\.");
2. 逗号分隔符:
Scanner in = new Scanner(System.in);
in.useLocale(Locale.FRENCH);
或
Scanner in = new Scanner(System.in);
in.useDelimiter(",");
所以重构你的代码:
Scanner in = new Scanner(System.in);
in.useLocale(Locale.ENGLISH);
while (in.hasNextDouble()) {
System.out.println(Double.parseDouble(in.nextLine()));
}
要了解清楚的问题,你可以使用此代码:
Locale.setDefault(Locale.FRANCE);
Scanner in = new Scanner(System.in);
System.out.println(in.hasNextDouble());
Double.parseDouble(in.nextLine());
与输入:1,1
结果hasNextDouble() is true w这里是Double.parseDouble(in.nextLine()) throws NumberFormatException。
希望它有帮助。
谢谢你的回答,我会尝试它 – Xander
因为它不知道你已经完成输入数字。关闭流(例如按下Ctrl-D) –
不,它在读入这个输入后停止,它应该仍然按照我的猜测读 – Xander
但是如果你不关闭流,它不知道没有任何东西出现,所以它只是等待。 [这里工作正常](http://ideone.com/y19u7S)。 –