我正在尝试使用
有什么想法,为什么会出现这种情况?
double.TryParse()
解析字符串 "0.0000",但是不知道为什么它在这个特定的例子中返回 false。当我传递整数样式的字符串,例如 "5",它会正确解析为值 5。有什么想法,为什么会出现这种情况?
代码在运行时会考虑本地化设置...也许你正在运行一个以逗号 ,
作为小数点而非点 .
的系统上...
在您的情况下,我假设您希望使用固定的区域设置,无论您在哪个系统上运行,小数点都是 .
:
double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)
或者
double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)
以下是一些MSDN参考链接:
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)
Thread.CurrentCulture
没有使用点作为小数分隔符。double.TryParse
的另一个重载:style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
// whatever
}
如果当前文化中指定的小数点分隔符与.
字符不同,则它将返回false
。
在解析字符串表示形式时,您需要注意它们所代表的文化,否则您将获得意外行为。
在这种情况下,您将得到false
,但更糟糕的是,例如在以下示例中,如果您期望获得数字1,您将得到一千:
Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");
double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);
Thread.CurrentThread.CurrentCulture
来获取它。在ASP.NET应用程序中可能会有所不同。http://msdn.microsoft.com/en-us/library/994c0zb1.aspx
零进零出。
要将文化更改为使用“.”作为小数分隔符,请使用:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
使用 TryParse 更改 CultureInfo 对我没有任何作用。我必须在控制面板下更改数字格式(更改日期、时间或数字格式),并更改小数符号。然后它又可以工作了。
if ((double.TryParse(sVat, out vat)) == false)
if (double.TryParse(sVat.Replace(",", "."), out vat) == false)
double.TryParse(sVat.Replace(".", ","), out vat);
对我来说它有效:
double temp = 0;
Console.WriteLine(double.TryParse("0.0000", out temp));
Console.ReadLine();
写入 True
。
IFormatProvider
,以便可以指定文化)。 - RichardTryParse
默认使用当前文化。(在我看来这是一个愚蠢的决定,但现在改变已经太晚了) - CodesInChaos