我有以下代码:
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()-使用您的语言环境指定的分隔符。
结果是这些方法之一可以使用逗号作为分隔符,而另一种方法可以使用点。
要解决该问题,您应该统一从输入中读取/解析double的方法,并确定要使用的分隔符。
您可以设置分隔符的类型,例如,使用:
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()的结果为true,而Double.parseDouble(in.nextLine())引发NumberFormatException。
希望能帮助到你。
关于java - parseDouble vs nextDouble,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40551038/