为什么double.TryParse(" 6E02",out tempDouble)返回true?

时间:2014-10-17 15:11:19

标签: c# double tryparse exponent

我花了一天的时间来弄清楚if语句之一为字符串值返回true的问题。

我们正在解析以检查值是数字还是字符串。我发现使用了这个语句,当字符串值作为6E02时,语句返回true,这是一个double值。

var double temp;
var val ="6E02"
result = double.TryParse(val, out temp)

如何解决此问题,以便为(数字)E0(数字)

等字符串返回结果false

简单的方法我相信首先检查文本是否包含E0,如果它只是返回false。但有没有更好的方法来处理这个或另一个内置的方法来用?

替换方法

3 个答案:

答案 0 :(得分:13)

6E02是6 * 10 ^ 2或600的科学记数法,这肯定是双倍的。这是内置于C#。

如果你想用科学记数法排除数字,TryParse有一个过载,它有几个选项,其中一个选项是否包括科学记数法。

var double temp;
var val = "6E02";
result = double.TryParse(val, NumberStyles.None, CultureInfo.CurrentCulture, out temp);
....

此示例不采用任何样式,这意味着只会解析带有数字的字符串。您可以在Sam的回答中提及其他选项。

您还必须指定具有此重载的区域性;我的示例使用应用程序的当前文化,但您可以明确地给它任何你想要的。

答案 1 :(得分:10)

默认情况下,double.TryParse使用NumberStyles中的以下标记:

  • NumberStyles.AllowThousands
  • NumberStyles.Float,它是以下组合的别名:
    • NumberStyles.AllowLeadingWhite
    • NumberStyles.AllowTrailingWhite
    • NumberStyles.AllowLeadingSign
    • NumberStyles.AllowDecimalPoint
    • NumberStyles.AllowExponent

您可以使用other overload of TryParse根据自己的喜好仅指定其中的一部分。特别是,您希望删除(至少)AllowExponent标志。

答案 2 :(得分:3)

它返回true,因为它将其视为科学记数法,as noted here

  

大写或小写字符' e',表示指数(科学)表示法。

最简单的方法是检查字符串是否包含字母e

if(val.ToLower().Contains("e"))
{
    //Remove the letter, or parse it in a different way.
}