2014-02-14 192 views
2

我需要驗證雙精度值。當我TryParse .00 or ,00返回false,但我允許這個值必須爲true。TryParse雙精度值

此代碼不是這種情況下正常工作

模型= 00或0.002,或789或0.12 ...

double number; 
double.TryParse(model, NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number) 
+0

爲什麼不閱讀[documentation](http://msdn.microsoft.com/en-us/library/3s27fasw%28v=vs.110%29.aspx)? – Andreas

+0

運行這個'「.00」'成功解析爲'0','「,00」'返回false。 – asawyer

+0

我需要「,00」返回true也 – zrabzdn

回答

3

你可以循環所有支持文化:

bool parsable = false; 
double number = 0; 
var supportedCultures = new[] { CultureInfo.InvariantCulture, CultureInfo.CreateSpecificCulture("de-DE") }; 
foreach(var culture in supportedCultures) 
{ 
    parsable = double.TryParse(model, NumberStyles.Any, culture, out number); 
    if (parsable) 
     break; 
} 

或LINQ:

CultureInfo thisCulture = supportedCultures 
    .FirstOrDefault(c => double.TryParse(model, NumberStyles.Any, c, out number)); 
if (thisCulture != null) 
{ 
    Console.WriteLine("Number was parsable to " + number); 
} 

老辦法,太容易出錯asawyer指出("1,000,000.00"):

你可以用點代替逗號:

bool parsable = double.TryParse(model.Replace(",", "."), NumberStyles.Any, NumberFormatInfo.InvariantInfo, out number); 

+1

「1,000,000.00」'如何解析此更改? – asawyer

+0

字符串替換是一種骯髒且可能破解的黑客行爲。通過你想要支持的文化循環是正確的方法,因爲事實上,解析'.00'和',00'都意味着什麼。 – Yuck

+0

@asawyer:我已經「刪除」了這種方法,因爲它非常容易出錯。 –

0

當您使用NumberFormatInfo.InvariantInfo您強制解析器將.作爲小數分隔符,將,作爲千位分隔符。所以

double.TryParse(".002", out number) 

將返回true,但

double.TryParse(",789", out number) 

不會。

如果你想支持多種格式,你必須爲每種格式調用TryParse。沒有辦法嘗試和解析一個格式有效的數字,因爲它們可能會返回不同的值。根據您使用的文化不同,"123,456"可能被解釋爲兩種不同的方式。

0

我不認爲你可以真正安全地做到這一點。如果您設法讓系統處理將"."","定義爲小數點分隔符和分組分隔符的兩種方法,那麼您會遇到模糊不清的問題。

例如,如果"1.001"被傳入?那麼"1,001"?你怎麼知道一個是真的意味着「千分之一」還是「千分之一」?