2009-06-18 52 views
10

我有一個文本文件,我使用它將信息輸入到我的應用程序中。問題是有些值是float,有時它們是null,這就是爲什麼我得到一個例外。float.Parse()不按我想要的方式工作

 var s = "0.0"; 
     var f = float.Parse(s); 

上面的代碼在第2行引發異常「輸入字符串的格式不正確」。

我相信解決方案將是float.Parse的高級重載,其中包括IFormatProvider作爲參數,但我還不知道它的一切。

如何解析「0.0」?

+0

我試過你的代碼了,我能夠解析值罰款。 – 2009-06-18 18:58:51

+3

此代碼依賴於文化(即依賴於區域設置)。所以我們有些人不會看到這種行爲。 – inazaruk 2009-06-18 19:05:40

回答

22

點符號「。」不用作分隔符(這取決於文化設置)。所以,如果你想絕對確保點被正確解析,你需要寫這樣的事:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
2

我剛剛試過這個,它沒有拋出任何異常。

您的數字格式是否使用小數點逗號而不是小數點?您是否嘗試過:

var s = "0,0"; 
var f = float.Parse(s); 

經詢問,這個我剛剛用逗號期待得到一個異常嘗試過,但沒有。所以這可能不是答案。

+0

可以使用正確的語言環境生成異常,例如英語。 – Akku 2012-01-16 14:38:51

+0

@Akku - 我不記得我做過的確切測試(我在2年前發佈了這個答案),但我知道區域設置以及它們如何影響數字解析。我向用戶建議*他的*語言環境設置爲期望的十進制逗號而不是小數點。 – ChrisF 2012-01-16 14:46:00

2

或者,您可以簡單地檢查輸入文本是否爲空或空。

另外,要小心,因爲在某些國家,「。」 (點)分隔浮點數是「,」(逗號)

6

您可以檢查null或空字符串第一。

您也可以使用Parse(或甚至使用TryParse)的重載之一來給出更具體的控制。

E.g.檢查使用invarient培養,以避免與非用戶可見數據小數點變化(例如從A2A通信):

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

我以下工作:

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

相反的情況(適用於所有coutries):

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
相關問題