为什么double.TryParse(“0.0000”,out doubleValue)返回false?

时间:2011-12-11 11:26:50

标签: c# parsing double

我试图用double.TryParse()解析字符串“0.0000”,但我不知道为什么它会在这个特定的例子中返回false。当我传递类似整数的字符串时,例如“5”它正确解析为5的值。

任何想法为什么会发生?

9 个答案:

答案 0 :(得分:50)

它将运行时的本地化设置考虑在内...也许您在.不是小数点但,代替...

的系统上运行此功能

在您的具体情况下,我假设您想要一个固定的文化,无论您使用.作为小数点运行的系统如何:

double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)

OR

double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)

一些MSDN参考链接:

答案 1 :(得分:9)

TryParse默认使用当前文化。如果您当前的文化使用与.不同的小数分隔符,则无法按您的意图解析0.0000。所以你需要传递CultureInfo.InvariantCulture

var numberStyle = NumberStyles.AllowLeadingWhite |
                 NumberStyles.AllowTrailingWhite |
                 NumberStyles.AllowLeadingSign |
                 NumberStyles.AllowDecimalPoint |
                 NumberStyles.AllowThousands |
                 NumberStyles.AllowExponent;//Choose what you need
double.TryParse( "0.0000", numberStyle, CultureInfo.InvariantCulture, out myVar)

答案 2 :(得分:3)

几乎可以肯定,问题是Thread.CurrentCulture不使用点作为小数点分隔符。

如果您知道该号码将始终使用点作为小数点分隔符进行格式化,请使用此代码,该代码使用double.TryParse style = NumberStyles.Float | NumberStyles.AllowThousands; culture = CultureInfo.InvariantCulture; float num; if (double.TryParse("0.0000", style, culture, out num)) { // whatever }

{{1}}

答案 3 :(得分:2)

如果当前文化指定的小数点分隔符不同于false字符,它将返回.

解析字符串表示时,你需要知道它们代表什么文化,否则你会得到意想不到的行为。

在这种情况下,你得到false,但它甚至可能更糟,例如在下面的例子中,如果你期望得到第一个,你会得到一千:

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");

double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);

这是因为在pt-PT文化中,.字符用作NumberGroupSeparator,字符用作NumberDecimalSeparator

如果您正在解析的输入来自用户,则始终使用与用户关联的区域性来解析它。获取用户所关联的文化取决于上下文,例如在Windows窗体应用程序中,在UI线程上使用Thread.CurrentThread.CurrentCulture来获取它。在ASP.NET应用程序中,这可能会有所不同。

答案 4 :(得分:1)

将文化改变为具有"。"作为小数分隔符使用:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

答案 5 :(得分:1)

  

当此方法返回时,包含双精度浮点数   等于s参数的数字,如果转换成功,或者   如果转换失败,则为零。

从此方法的MSDN页面。

http://msdn.microsoft.com/en-us/library/994c0zb1.aspx

零进入,零出现。

答案 6 :(得分:0)

使用TryParse更改CultureInfo对我没有任何帮助。我必须更改控制面板下的数字格式(更改,日期,时间或数字格式)并更改十进制符号。比它再次工作。

答案 7 :(得分:-1)

最愚蠢的是它只接受","作为我文化中的小数分隔符,但结果是"。"。某个人,某个地方,当天没想到...... 所以我试试这个:

if ((double.TryParse(sVat, out vat)) == false)
    if (double.TryParse(sVat.Replace(",", "."), out vat) == false)
      double.TryParse(sVat.Replace(".", ","), out vat);

答案 8 :(得分:-3)

它对我有用:

double temp = 0;
Console.WriteLine(double.TryParse("0.0000", out temp));
Console.ReadLine();

True