2013-12-13 52 views
1

我想在數組中保存一個雙重用戶條目,但我得到了逗號/點的問題。 當我輸入「3,4」時,控制檯顯示「3,4」 - >正確/ 當我輸入「3.5」時,控制檯顯示「34」 - >爲什麼?用戶重複輸入逗號/點問題

static void Main(string[] args) 
{ 
    double[] array = new double[3]; 
    bool schleife = true; 

    while (schleife) 
    { 
     try 
     { 
      Console.WriteLine("Please enter a Figure"); 
      array[0] = Double.Parse(Console.ReadLine()); 
      schleife = false; 
     } 
     catch 
     { 
      Console.WriteLine("Error try again"); 
     } 
    } 

    Console.WriteLine("Value is: {0}", array[0]); 
    Console.ReadKey(); 
} 

雷友顯然不存在這些問題....

+6

這是你的文化背景。在德國文化中(從「schleife」中猜測),double由''代替,''代替。 「。」表示千位,如:「1.000.000,00」。 – germi

+0

它在我身上顯示'35'。你的文化是什麼? 'Double.Parse'使用當前的文化。 –

+1

千萬不要永遠,永遠,永遠捕獲異常並丟棄結果。這就像剝香蕉,扔掉香蕉和吃皮。 –

回答

1

你檢查,在其中運行應用程序的文化?

此外,你可以放置一個斷點,並檢查什麼輸入實際上存儲在您的數組?

爲什麼我要求您驗證它?這個問題很可能是一個文化問題,由於不同文化中的格式不同,這個問題真的會使小數和日期變得混亂。

可能在你的文化中,我認爲它是「de-DE」,例如,數字「千和百」寫作1.000,01,而在例如文化「en-US」中相同的數字寫爲1,000.01。

使用非預先格式化的十進制用戶輸入時,總是建議您在應用中定義默認文化。如果你不這樣做,它會自動把它運行的計算機的文化。

這樣做是很容易的,只要加入這一行你的應用程序:

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); 

這將確保您的應用程序總是在需要的文化運行,而且所有的十進制數字正確讀取。

當然,你可以將其設置爲任何一種文化想要

0

在.NET中each cultureNumberFormatInfo。這個數字格式有一個NumberDecimalSeparator和一個NumberGroupSeparator。在你的情況下,組分隔符是.,小數點分隔符是,。因此,第一個例子在文化中被正確解析爲小數,而第二個例子被解析爲分組數字。

+0

以及我能做些什麼來讓他將兩種類型轉換爲正確的數字? – user3087913

1

我想你是來自德國嗎?因爲您使用「,」作爲小數點。 C#使用本地計算機設置來解析數字。因此,「3.5」將被解析爲不同的「3,5」。

這是一個常見問題。您可以使用double.Parse("3.5", CultureInfo.InvariantCulture)來解析帶有「。」的小數。然而,這不適用於「,」。

你必須決定你想要使用哪種格式,然後繼續使用你的應用程序的格式。

您也可以手動設置分隔符使用:

var ci = CultureInfo.InvariantCulture.Clone() as CultureInfo; 
ci.NumberFormat.NumberDecimalSeparator = ","; 
double.Parse("3,5", ci) 
+0

這聽起來對我來說很困惑^^爲什麼只有我有這個問題,我的朋友不是? – user3087913

+0

也許是因爲他們都使用「,」(3,5)輸入數字,而不是使用「。」。 (3.5)像你一樣。 – RononDex

+0

沒有朋友檢查過它,並且兩個輸入都沒有問題 – user3087913

0

我會去:

Double.Parse(Console.ReadLine().replace(",","."), CultureInfo.InvariantCulture) ; 

它應該工作,甚至在土耳其:d