2014-11-23 76 views
0

如何從控制檯讀取例如0.3的雙精度值?當我使用0.3之前提到的.X類型的東西時,它會拋出異常。從控制檯讀取雙精度值

到目前爲止,我已經試過類似的東西:

Console.WriteLine("Type x: "); 
double x = Convert.ToDouble(Console.ReadLine()); 
+1

你是什麼意思_doesn't WORK_?你得到任何異常或錯誤信息?什麼是你的「CurrentCulture」? – 2014-11-23 19:58:32

+0

系統格式異常。 – Sheil 2014-11-23 19:59:06

+0

使用'Double.Parse'或'Double.TryParse'而不是'Convert.ToDouble',它給了你更多的控制。 – 2014-11-23 19:59:16

回答

4

Convert.ToDouble(string)方法使用Double.ParseCurrentCulture設置。這裏是怎樣的implemented;

public static double ToDouble(String value) 
{ 
    if (value == null) 
     return 0; 
    return Double.Parse(value, CultureInfo.CurrentCulture); 
} 

而這個Double.Parse執行爲;

public static double Parse(String s, IFormatProvider provider) 
{ 
    return Parse(s, NumberStyles.Float| NumberStyles.AllowThousands, NumberFormatInfo.GetInstance(provider)); 
} 

正如你可以看到,這個解析操作會成功只有如果你的NumberStyles.Float| NumberStyles.AllowThousandsCurrentCulture設置匹配。

我強烈懷疑你的CurrentCultureNumberFormatInfo.NumberDecimalSeparator property不是點(.)這就是爲什麼你的代碼拋出FormatException

你可以選擇2個選項;請使用NumberDecimalSeparator作爲.的文化,如InvariantCulture.Clone您的CurrentCulture,並將其設置爲NumberDecimalSeparator.

Console.WriteLine("Type x: "); 
double x = DateTime.Parse(Console.ReadLine(), CultureInfo.InvariantCulture); 

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
culture.NumberFormat.NumberDecimalSeparator = "."; 
Console.WriteLine("Type x: "); 
double x = DateTime.Parse(Console.ReadLine(), culture); 
+0

感謝您的詳細聲明。是的,我的CUrrenctCulture的分隔符是',':) – Sheil 2014-11-23 20:13:53

0

試試這個:

double x = double.Parse(Console.ReadLine(), NumberStyles.Any, CultureInfo.InvariantCulture); 
0

我會用的TryParse:

Console.Write("Type x: "); 
var input = Console.ReadLine(); 
double value; 

while (!double.TryParse(input, NumberStyles.Any, 
    CultureInfo.InvariantCulture, out value)) 
{ 
    Console.Write("{0} is not a double. Please try again: "); 
    input = Console.ReadLine(); 
} 

Console.WriteLine("Thank you! {0} is a double", value);