2011-05-29 149 views
5

我正在讀取XML文件中的數字。其他數字帶逗號分隔符(0,1111),其他數字帶點(0.1111)。我如何解析這些數字,以便最終得到理想的結果?我嘗試使用float.Parse(reader.Value, System.Globalization.CultureInfo.InvariantCulture);,但它不起作用。例如,我有reader.Value =「0,01119703」並被解析爲1119703.0。C#解析從字符串浮點數

+0

你想把它解析爲什麼? – soandos 2011-05-29 23:52:05

+0

誰給你這樣奇怪的數據?似乎真正的問題是與源... – Cameron 2011-05-29 23:54:41

+0

@soandos我希望它被解析爲一個浮點數。最初它是字符串。 – user579674 2011-05-29 23:56:21

回答

10

我不認爲有可能同時使用兩個不同的小數點分隔符。我想我會使用Replace()將任何逗號更改爲點。

float.Parse(reader.Value.Replace(',', '.'), System.Globalization.CultureInfo.InvariantCulture); 
+0

這種方法的一個風險是如果數字可能是1000.00的格式 – 2011-05-29 23:57:09

+0

這有點不妥。如果輸入「3,456.78」,上面的代碼會將其更改爲「3.456.78」,這可能會導致解析錯誤。 – 2011-05-29 23:57:28

+0

這不是一個選項。我無法改變任何來源。 – user579674 2011-05-29 23:57:56

2

XML文件中是否有任何內容會告訴您正在使用哪種格式? .NET中沒有內置的方法可以使用兩個不同的允許的十進制分隔符。如果沒有任何信息告訴你一個數字的格式,那麼你總是可以檢查字符串是否包含句點或逗號,並創建一個NumberFormatInfo作爲小數分隔符。當然,如果任何數字有一個句點或逗號作爲千位分隔符,這將不起作用。

+0

他們是小數字,所以可能沒有任何千位分隔符。我如何檢查它是否是逗號或點?如果包含這些字符,我必須檢查字符串嗎? – user579674 2011-05-29 23:59:29

+0

您不必檢查任何內容,只需使用Replace()函數即可。如果它找不到要替換的字符,它將返回原始字符串。看到我在回答中發佈的代碼:-) – AHM 2011-05-30 00:03:04

4

不知道這是最好的解決方案,但也許你可以依靠一套已知的「自定義」數字格式。舉例來說,你可以聲明瞭兩個自定義數字格式(無論是從頭開始或基於關閉已知的格式的),如:

private static readonly NumberFormatInfo DecimalSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ".", NumberGroupSeparator = "," }; 
private static readonly NumberFormatInfo CommaSeparatorFormat = new NumberFormatInfo { NumberDecimalSeparator = ",", NumberGroupSeparator = "." }; 

然後嘗試通過解析您知道接受的格式數量:

if (!Single.TryParse(unparsedValue, NumberStyles.Float, DecimalSeparatorFormat, out parsedValue) && !Single.TryParse(unparsedValue, NumberStyles.Float, CommaSeparatorFormat, out parsedValue)) 
    throw new FormatException("Number format not supported"); 

這假定您有一定數量的已知格式,如果您的輸入可能真的存在於任何文化中,那麼您找到一個好的解決方案可能會不太順利。

使用這種方法的一個勝利是你至少在你能夠支持的格式中明確表示,而不是依靠簡單的字符串替換(這可能會導致格式無效)。