【问题标题】:Convert String to Decimal Mystery将字符串转换为十进制之谜
【发布时间】:2026-01-17 16:55:01
【问题描述】:

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

【问题讨论】:

  • strDec的值是多少

标签: c# .net string decimal


【解决方案1】:

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

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

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

【讨论】:

  • 提问者没有说输入字符串是什么,但我怀疑这是正确的。 +1
【解决方案2】:

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

使用指定CultureInfo 的重载:

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

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

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

【讨论】:

    【解决方案3】:

    尝试使用无文化模式

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

    【讨论】:

    • 是的!那是!!谢谢!!
    【解决方案4】:

    我们遇到了这个问题

    Convert.ToDecimal("0.5", CultureInfo.InvariantCulture); 
    

    是 0,5

    ,但是

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

    是 5 岁!

    解决方案是使用

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】: