我遇到了一个关于在C# .NET中将字符串转换为十进制数的问题。问题是,我编写了以下代码,并且在我的开发Windows 7 .NET Framework 3.5系统上可以正常工作。但是,如果我将应用程序移动到Windows 2003 Server .NET 3.5 Framework上,结果会不同。有人能理解发生了什么吗?
代码:
dec = Convert.ToDecimal(strDec);
Windows 7 结果:85.00 Windows 2003 结果:8500
可能是您的服务器区域和文化设置将,
作为小数分隔符,将.
作为数字分组符。请参见控制面板/区域和文化设置。
如果此数字字符串是由您的应用程序生成的,则建议在两个位置中都使用CultureInfo.InvariantCulture
。
Decimal dec = 85.0m;
string s = dec.ToString (CultureInfo.InvariantCulture);
decimal.Parse(s, CultureInfo.InvariantCulture);
你受到区域设置的影响。当字符串“85.00”在使用句点作为小数分隔符的语言环境中被解析时,结果为85.00。如果使用逗号作为小数分隔符,则结果为8500。
请使用指定CultureInfo
的重载。
var dec = Convert.ToDecimal(strDec, CultureInfo.GetCultureInfo("en"));
您还可以使用CultureInfo.InvariantCulture
,它是默认的.NET CultureInfo
,与英文CultureInfo
类似。
在生产质量的应用程序中,您应该始终指定或知道解析和格式化字符串时使用的CultureInfo
。如果您在项目中打开代码分析,当您忘记执行此操作时,将收到警告:CA1304:指定 CultureInfo。
var decimalValue = Convert.ToDecimal(stringValue, CultureInfo.InvariantCulture);
Convert.ToDecimal("0.5", CultureInfo.InvariantCulture);
原为0.5
,但是
Convert.ToDecimal("0,5", CultureInfo.InvariantCulture);
数字变成了 5!
解决方案是使用
Convert.ToDecimal(stringValue.Replace(",", "."), CultureInfo.GetCultureInfo("en"));
public static Decimal GetInvariantDecimal(string Value)
{
try
{
Decimal d = 0;
if (Decimal.TryParse(Value, out d))
return d;
else
return Convert.ToDecimal(Value, System.Globalization.CultureInfo.InvariantCulture);
}
catch (Exception ex)
{
throw ex;
}
}
strDec
的值是什么? - Thomas Levesque