parseDouble vs nextDouble

时间:2016-11-11 15:23:31

标签: java string parsing double

我有以下代码:

Scanner in = new Scanner(System.in);
while (in.hasNextDouble()) {
    System.out.println(Double.parseDouble(in.nextLine()));
}

输入:

1.1
2.2
3.3

程序在读取此输入后停止,而我认为它仍应从输入读取。 那是为什么?

1 个答案:

答案 0 :(得分:4)

问题可能是您的默认语言环境使用逗号作为分隔符 Double.parseDouble() - 始终使用点作为分隔符 in.nextDouble() - 使用您的区域设置指定的分隔符 结果是其中一个方法可以使用逗号作为分隔符,而另一个使用点。

要解决这个问题,您应该统一从输入中读取/解析双打的方法,并确定要使用的分隔符。
您可以设置分隔符的类型,例如使用:
  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。

希望它有所帮助。