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

本文关键字:十进制 奥秘 转换 字符串 | 更新日期: 2023-09-27 18:00:27

我遇到了一个使用C#从字符串转换为十进制的问题。问题是我已经编写了以下代码,并且在我的开发Windows 7.NET Framework 3.5系统上运行良好。但是,如果我在Windows2003Server.NET3.5Framework上移动应用程序,结果会有所不同。有人能理解那里发生了什么吗?

代码:

dec = Convert.ToDecimal(strDec);

Windows 7结果:85.00Windows 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;
    }
}

但它只适用于类似俄语的十进制分隔符