2016-11-11 23 views
2

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

程序停止,因爲我認爲,它應該仍然輸入讀取。 這是爲什麼?

+0

因爲它不知道你已經完成輸入數字。關閉流(例如按下Ctrl-D) –

+0

不,它在讀入這個輸入後停止,它應該仍然按照我的猜測讀 – Xander

+0

但是如果你不關閉流,它不知道沒有任何東西出現,所以它只是等待。 [這裏工作正常](http://ideone.com/y19u7S)。 –

回答

4

問題可能是您的默認語言環境使用逗號作爲分隔符。
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。

希望它有幫助。

+1

謝謝你的回答,我會嘗試它 – Xander

相關問題