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

时间:2011-06-27 21:11:48

标签: c# .net string decimal

我遇到了使用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

5 个答案:

答案 0 :(得分:19)

可能是服务器上的区域和区域设置设置为,为十进制,.为数字分组。请参阅控制面板/区域和区域设置。

如果您的应用程序生成此数字字符串,我会在两个地方都使用CultureInfo.InvariantCulture

     Decimal dec = 85.0m;
     string s = dec.ToString (CultureInfo.InvariantCulture);
     decimal.Parse(s, CultureInfo.InvariantCulture);

答案 1 :(得分:9)

您受区域设置的影响。当字符串85.00在完全停止用作小数分隔符的区域设置中解析时,结果为85.00。如果逗号用作小数分隔符,则结果为8500。

使用指定CultureInfo

的重载
var dec = Convert.ToDecimal(strDec, CultureInfo.GetCultureInfo("en"));

您还可以使用CultureInfo.InvariantCulture这是默认的.NET CultureInfo,类似于英语CultureInfo

在生产质量应用程序中,您应始终指定或了解解析和格式化字符串时使用的CultureInfo。如果您在项目中启用代码分析,则会在忘记执行此操作时收到警告:CA1304: Specify CultureInfo

答案 2 :(得分:3)

尝试使用culture-ignorant模式

var decimalValue = Convert.ToDecimal(stringValue, CultureInfo.InvariantCulture);

答案 3 :(得分:3)

我们在

时遇到了这个问题
Convert.ToDecimal("0.5", CultureInfo.InvariantCulture); 

是0.5

,但是

Convert.ToDecimal("0,5", CultureInfo.InvariantCulture);

是5!

解决方案是使用

Convert.ToDecimal(stringValue.Replace(",", "."), CultureInfo.GetCultureInfo("en"));

答案 4 :(得分:1)

所以,我使用了下一个功能

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

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