2011-05-29 118 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"); 

这假定您有一定数量的已知格式,如果您的输入可能真的存在于任何文化中,那么您找到一个好的解决方案可能会不太顺利。

使用这种方法的一个胜利是你至少在你能够支持的格式中明确表示,而不是依靠简单的字符串替换(这可能会导致格式无效)。