C#从字符串解析浮点

C#从字符串解析浮点,c#,parsing,floating-point,C#,Parsing,Floating Point,我正在从XML文件中读取数字。其他数字带有逗号分隔符(01111),其他数字带有点(0.1111)。如何解析这些数字,以便最终得到所需的结果?我尝试使用float.Parse(reader.Value,System.Globalization.CultureInfo.InvariantCulture)但它不起作用。例如,我有reader.Value=“001119703”,并被解析为1119703.0。我不认为可以同时使用两个不同的十进制分隔符。我想我应该使用Replace()将任何逗号改为点

我正在从XML文件中读取数字。其他数字带有逗号分隔符(01111),其他数字带有点(0.1111)。如何解析这些数字,以便最终得到所需的结果?我尝试使用
float.Parse(reader.Value,System.Globalization.CultureInfo.InvariantCulture)但它不起作用。例如,我有reader.Value=“001119703”,并被解析为1119703.0。

我不认为可以同时使用两个不同的十进制分隔符。我想我应该使用Replace()将任何逗号改为点

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

XML文件中是否有任何东西可以告诉您正在使用哪种格式?在.NET中没有一种内置方式可以使用两个不同的允许小数分隔符。如果没有任何信息告诉您一个数字将采用哪种格式,那么您可以随时检查字符串是否包含句点或逗号,并创建一个NumberFormatInfo,将其作为十进制分隔符。当然,如果任何数字都有句点或逗号作为千位分隔符,这将不起作用。

不确定这是最好的解决方案,但也许您可以依赖一组已知的“自定义”数字格式。例如,您可以声明两种自定义数字格式(从头开始或基于已知格式),例如:

然后尝试通过已知的可接受格式解析数字:

  if (!Single.TryParse(unparsedValue, NumberStyles.Float, DecimalSeparatorFormat, out parsedValue) && !Single.TryParse(unparsedValue, NumberStyles.Float, CommaSeparatorFormat, out parsedValue))
    throw new FormatException("Number format not supported");
这假设您有有限数量的已知格式,如果您的输入可以真正在任何文化中,那么您可能无法找到一个很好的解决方案


这种方法的一个好处是,您至少能够以您能够支持的格式显式显示,而不是依赖于简单的字符串替换(这可能导致格式无效)

你想把它解析成什么?谁给你这么奇怪的数据?看来真正的问题是源代码…@soandos我希望它被解析为浮点数。最初它是字符串,并非所有地区都使用。作为他们的小数分隔符,因此,如果这是一个应用程序,您可能会收到来自en US和fr CA的数字,例如,您可能会得到。或者分别。欲了解更多信息@Cameron可能会,但我不能改变来源这种方法的一个风险是,如果数字的格式是1000.00,这有点不可靠。如果我输入“3456.78”,上面的代码会将其更改为“3.456.78”,这可能会导致解析错误。这不是一个选项。我不能更改源代码的任何内容。我不是说更改xml文件,只是更改代码,以便在将逗号传递到float.Parse()之前将其替换为点。正如其他人指出的那样,如果能有数千个分离器,这一点就会打破。在这种情况下,您可能需要使用正则表达式。它们是小数字,因此可能没有任何千分隔符。如何检查它是逗号还是圆点?我是否必须检查字符串是否包含这些字符?您不必检查任何内容,只需使用Replace()函数即可。如果找不到要替换的字符,则返回原始字符串。请参阅我在回答中发布的代码:-)
  if (!Single.TryParse(unparsedValue, NumberStyles.Float, DecimalSeparatorFormat, out parsedValue) && !Single.TryParse(unparsedValue, NumberStyles.Float, CommaSeparatorFormat, out parsedValue))
    throw new FormatException("Number format not supported");