【问题标题】:Convert string to decimal with format使用格式将字符串转换为十进制
【发布时间】:2011-05-11 11:16:13
【问题描述】:

我需要在 C# 中将字符串转换为小数,但是这个字符串有不同的格式。

例如:

“50085”

“500,85”

“500.85”

这应该转换为十进制的 500,85。是否有一种简化的形式来使用格式进行这种转换?

【问题讨论】:

  • 十进制不以“500,85”的格式存储。你要一对小数吗?
  • @myermian:嗯,它可以,这取决于你的文化/地区设置。并非每个人都以相同的方式表示十进制值。在此示例中,500,85 可能等同于 500.85
  • 50.865,85 可能出现在您的字符串中吗?

标签: c# string decimal


【解决方案1】:

有些文化使用逗号来表示浮点数。您可以在 aspx 页面上使用以下代码对此进行测试:

var x = decimal.Parse("500,85");
Response.Write(x + (decimal)0.15);

当线程文化设置为使用逗号作为浮点的文化时,这会给出答案 501。你可以这样强制:

var x = decimal.Parse("500,85", new NumberFormatInfo() { NumberDecimalSeparator = "," });

【讨论】:

    【解决方案2】:

    虽然 decimal.Parse() 是您正在寻找的方法,但您必须为其提供更多信息。它不会自动在您提供的 3 种格式之间进行选择,您必须告诉它您期望哪种格式(以 IFormatProvider 的形式)。请注意,即使使用 IFormatProvider,我认为“50085”也不会被正确拉入。

    我看到的唯一一致的事情是,从您的示例中可以看出,您总是期望两位小数的精度。如果是这种情况,您可以去掉所有句点和逗号,然后除以 100。

    可能是这样的:

    public decimal? CustomParse(string incomingValue)
    {
        decimal val;
        if (!decimal.TryParse(incomingValue.Replace(",", "").Replace(".", ""), NumberStyles.Number, CultureInfo.InvariantCulture, out val))
            return null;
        return val / 100;
    }
    

    【讨论】:

    • 我没有找到任何格式来解决我的问题。我使用这个实现并添加小数位。谢谢
    【解决方案3】:

    这将起作用,具体取决于您的文化设置:

    string s = "500.85";
    decimal d = decimal.Parse(s);
    

    如果您的文化默认不允许 , 而不是 . 作为小数点,您可能需要:

    s = s.Replace(',','.');
    

    但是需要检查多个....这似乎归结为更多的输入清理问题。如果您能够验证和清理输入以使其全部符合一组规则,则转换为十进制会容易得多。

    【讨论】:

    • +1 用于提及输入清理...-1 用于不处理“50085”。余额无票:)
    • 我担心也会有像50.865,85这样的输入
    • @Chris,50085 将导致小数点后的 50085。解析...不过,我会接受否决票,因为我认为这不能完全回答 OP 的问题。 :)
    【解决方案4】:

    试试下面的代码:

    string numValue = "500,85";
    System.Globalization.CultureInfo culInfo = new System.Globalization.CultureInfo("fr-FR");
    decimal decValue;
    bool decValid = decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat, out decValue);
    if (decValid)
    {
        lblDecNum.Text = Convert.ToString(decValue, culInfo.NumberFormat);
    }
    

    由于我给出的值是 500,85,我将假设文化是法语,因此小数点分隔符是“,”。然后 decimal.TryParse(numValue, System.Globalization.NumberStyles.Number, culInfo.NumberFormat,out decValue); 将在 decValue 中返回值为 500.85。同样,如果用户是美国英语,则更改 culInfo 构造函数。

    【讨论】:

      【解决方案5】:

      有很多方法:

      1. System.Convert.ToDecimal("232.23")
      2. Double.Parse("232.23")
      3. double test; Double.TryParse("232.23", out test)

      确保你尝试并抓住......

      【讨论】:

        【解决方案6】:

        这是一项名为数字分组符号的新功能。

        步骤:

        1. 在控制面板中打开区域和语言
        2. 点击附加设置
        3. 在“数字”选项卡上
        4. 数字分组符号设置为自定义设置。 换逗号;替换为(任何字符,如 A 到 Z 或 {/,})。 数字分组符号=e;

        例子:

        string checkFormate = "123e123";
        decimal outPut = 0.0M;
        decimal.TryParse(checkFormate, out outPut);
        Ans: outPut=123123;
        

        【讨论】:

          【解决方案7】:

          试试这个

           public decimal AutoParse(string value)
              {
                  if (Convert.ToDecimal("3.3") == ((decimal)3.3))
                  {
                      return Convert.ToDecimal(value.Replace(",", "."));
                  }
                  else
                  {
                      return Convert.ToDecimal(value.Replace(".", ","));
                  }
          
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-07-08
            • 1970-01-01
            • 2013-05-21
            • 1970-01-01
            • 2013-06-02
            • 1970-01-01
            • 1970-01-01
            • 2019-09-26
            相关资源
            最近更新 更多