我有如下因素代碼: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)。 –