C#中解析负数double数值时出现异常

18

我正在编写一段代码,从数据库中提取一些数据。问题是我想将负数字符串“−2.8”转换为double类型。我觉得这很简单。我首先尝试了:

var climateString = "−2.8";
var number = double.Parse(climateString);

通过这个结果:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

于是我再次思考,通过谷歌搜索得到了新的答案:

var climateString = "−2.8";
var styles = NumberStyles.AllowParentheses | NumberStyles.AllowTrailingSign |NumberStyles.Float | NumberStyles.AllowDecimalPoint;
var rit = double.Parse(climateString, styles);

又一次惨败:

An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll

我再次想了想,我不可能如此愚蠢以至于不知道如何完成这样一个简单的任务。我试过了这个:

 var climateString = "−2.8";
 var doue = Convert.ToDouble(climateString, CultureInfo.InvariantCulture);

是的,又是同样的异常。我开始看这个数字,并且发现了负号。仔细看这个数字“−2.8”,它不是一个负数,而是一个带有负号的数“-2.8”。再看这些符号“----- −−−−−”,它们并不相同。使用不同符号字符解析字符串会抛出异常:S。那么,有人有什么好的方法可以在C#中优雅地将其解析为double类型的数字吗?谢谢!


6
你知道问题在于它里面有一个错误的字符。所以要删除它吗? - Jeroen Vannevel
2
或者,先清理数据库中的源数据。垃圾进,垃圾出。 - James Gaunt
5个回答

21

正确的做法:

var climateString = "−2.8"; 

var fmt = new NumberFormatInfo();
fmt.NegativeSign = "−";
var number = double.Parse(climateString, fmt);    

在添加此格式后,常规的负号仍然有效吗? - MIKE
不确定。我认为不会。 - Søren Debois
如果它不能工作,即使从技术上来说是正确的,这个答案实际上是错误的。 - Stilgar
刚刚测试了一下,不起作用。这使得这个答案在任何实际情况下都是错误的。 - Stilgar
这对我没有起作用,我按照列出的代码原样使用了它。 - undefined

9

将破折号替换为连字符:

var climateString = "−2.8".Replace ("−", "-");
var number = double.Parse(climateString);

(但是您可能需要留意数据库中出现的其他奇怪字符。)

嗨,感谢您的答案,我会尝试这种方法。我以为有任何NumberStyle来处理这个。 - Fritjof Berggren
没错!我添加了第二个答案,其中包含正确的方法。 - Søren Debois
更好的方法。 - Himanshu Mange

7

也许这篇文章有些过时,但对于其他人来说可能还是有用的...

你使用了NumberStyles.AllowTrailingSign,那么可能应该使用NumberStyles.AllowLeadingSign,否则它将无法接受负号。


0
我建议使用TryParse方法而不是Parse方法,因为它能轻松地处理任何错误。
代码 - ``` var test1 = "-123.95"; decimal result; decimal.TryParse(test1, out result); ``` 您将在`result`中获取已解析的双精度值。

0

试试这个:

decimal.TryParse(number, NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out decimal numberOut)

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接