将字符串转换为十进制数的谜团

13

我遇到了一个关于在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


3
strDec的值是什么? - Thomas Levesque
5个回答

24

可能是您的服务器区域和文化设置将,作为小数分隔符,将.作为数字分组符。请参见控制面板/区域和文化设置。

如果此数字字符串是由您的应用程序生成的,则建议在两个位置中都使用CultureInfo.InvariantCulture

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

4
问询者没有说明输入字符串是什么,但我认为这个答案是正确的。+1 - Noldorin

10

你受到区域设置的影响。当字符串“85.00”在使用句点作为小数分隔符的语言环境中被解析时,结果为85.00。如果使用逗号作为小数分隔符,则结果为8500。

请使用指定CultureInfo的重载。

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

您还可以使用CultureInfo.InvariantCulture,它是默认的.NET CultureInfo,与英文CultureInfo类似。

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


4
尝试使用文化无关模式。
var decimalValue = Convert.ToDecimal(stringValue, CultureInfo.InvariantCulture);

是的!!就是那样!!谢谢!! - user730153

4
我们在处理时遇到了问题:
Convert.ToDecimal("0.5", CultureInfo.InvariantCulture); 

原为0.5

,但是

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

数字变成了 5!

解决方案是使用

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

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

但它仅适用于俄语十进制分隔符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接