将字符串转换为十进制神秘

我正面临着使用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")); 

所以,我使用了下一个function

 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; } } 

但它只适用于俄语,如小数点分隔符