【问题标题】:How do I format a C# decimal to remove extra following 0's?如何格式化 C# 十进制以删除额外的 0?
【发布时间】:2011-01-24 20:18:33
【问题描述】:

我想将字符串格式化为小数,但小数点后面包含一些零。如何格式化它以使那些无意义的 0 消失?

string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);

显示:

1100
1100.1
1100.100
1100.1000

但我希望它是:

1100
1100.1
1100.1
1100.1

作为参考,这里有其他基本上与此重复的问题,感谢此处给出的答案,我发现了这些问题:

【问题讨论】:

  • 1002.231 只是一个例子吗?也就是说,您希望 1.12000 是 1.12 还是 1.120?
  • 请注意,如果你想要一个 十进制 值,你应该使用一个,例如1100.1000米。注意“十进制文字”的“m”。
  • @Jon:谢谢我也注意到了这一点并去修复它,当我回来时你的评论正在等我.. 这么快......;)
  • @n8wrl:只是一个例子,是的,我更新了更多例子。

标签: c# format decimal tostring


【解决方案1】:

您可以将ToString()General ("G") Format Specifier 一起使用以达到所需的结果。使用指定精度的格式字符串时,尾随零被截断。为了防止在任何情况下进行舍入,您需要将精度设置为小数所允许的最大值 (29)。

产生你想要的代码行是number.ToString("G29"),其中number是你原来的小数。

请注意,任何小于 0.0001 的数字都将转换为科学计数法。有关此格式化程序如何工作的更多详细信息,请参见上面的参考链接。

【讨论】:

  • 我认为这是解决问题的最佳方法。
  • 同意——切换答案。谢谢,@Herohtar。
  • 警告:注意像 0.000001 这样的值。 G29 格式将以尽可能短的方式呈现它们,因此它将切换到指数符号。 string.Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-U‌​S"))) 将给出“1E-08”作为结果。归功于康拉德:stackoverflow.com/questions/4525854/remove-trailing-zeros/…
  • @DougS:对于小于 0.0001 的数字,它似乎切换到科学记数法(例如,0.0001 保持不变,但 0.00009 将是 9E-05)在大多数情况下,这似乎不太可能成为问题想要截断零,但仍然知道这是一件好事。
  • G29 不是必需的。 "G0"=="G29" 表示小数
【解决方案2】:
string s = d.ToString("0.#############################");

【讨论】:

    【解决方案3】:

    您可以像这样指定format string

    String.Format("{0:0.000}", x);
    

    【讨论】:

    • 但我不知道它最后有三位小数,我的意思只是作为一个例子。我会让问题更清楚。
    【解决方案4】:

    它们不一定没有意义——它们表示计算过程中的精度。小数保持其精度水平,而不是被标准化。

    我在this answer 中有一些代码,它将返回一个规范化的值——你可以使用它,然后格式化结果。例如:

    using System;
    using System.Numerics;
    
    class Test
    {
        static void Display(decimal d)
        {
            d = d.Normalize(); // Using extension method from other post
            Console.WriteLine(d);
        }
    
        static void Main(string[] args)
        {
            Display(123.4567890000m); // Prints 123.456789
            Display(123.100m);        // Prints 123.1
            Display(123.000m);        // Prints 123
            Display(123.4567891234m); // Prints 123.4567891234
        }
    }
    

    怀疑大多数格式字符串方法都会失败。我猜是“0”的格式字符串。然后 28 # 个字符就可以了,但是会很丑……

    【讨论】:

    • 看起来您的解决方案仅适用于 .Net 4.0。
    • @Gabe:除非您使用第 3 方 BigInteger 实现,否则是的。它也非常低效。另一方面,它具有工作的优势:)
    【解决方案5】:

    怎么样:

    string FormatDecimal(decimal d)
    {
        const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
        string s = d.ToString();
        // if there's no decimal point, there's nothing to trim
        if (!s.Contains(point) == -1)
            return s;
        // trim any trailing 0s, followed by the decimal point if necessary
        return s.TrimEnd('0').TrimEnd(point);
    }
    

    【讨论】:

    • 使用 System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator 而不是 '.'?
    【解决方案6】:

    与大家建议使用G 格式说明符不同,我建议使用以下方法来保留千位分隔符和小数点,同时删除额外的尾随零:

    {0:#,#.##}
    

    这种格式的结果在大多数情况下都比G好很多:

    String.Format("{0:#,#.##}",25/2.4);
    10.42
    
    String.Format("{0:#,#.##}",1000000);
    1,000,000
    
    String.Format("{0:#,#.##}",1000000.3600000);
    1,000,000.36
    

    G 说明符并不能真正处理所有可能的组合:

    String.Format("{0:G29}",25/2.4);
    10.416666666666668
    
    String.Format("{0:G2}",25/2.4);
    10
    
    String.Format("{0:G29}",1000000.3600000);
    1000000.36
    
    String.Format("{0:G2}",1000000.3600000);
    1E+06
    

    【讨论】:

      【解决方案7】:

      已经有不少答案了。我经常参考这个备忘单:http://blog.stevex.net/string-formatting-in-csharp/

      【讨论】:

        【解决方案8】:

        有点骇人听闻,但这应该可行:

        decimal a = 100.00M;
        string strNumber = string.Format("{0}", a);
        Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
        

        【讨论】:

        • 确认!如果a = 100.000 怎么办?还是a = 0
        • @Gabe 正在修复中
        • @kerk 现在应该已修复。如果您发现更新答案的任何反例,请告诉我。
        • 不介意取消投票,除非更新后的答案仍然不令人满意?
        【解决方案9】:

        我相信你想做:

        var s = String.Format("{0:#####.###}");
        

        【讨论】:

          【解决方案10】:
          String.Format("{0:0.##}", 123.0); // "123"
          

          【讨论】:

          • 应该是... String.Format("{0:0.0##}", 123.456789m) 谢谢
          【解决方案11】:
          double a = 1100.00
          double  b =1100.1
          double  c = 1100.100
          double  d =1100.1000
          
          Remove last zero after point
          
          
          string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.');
          string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.');
          string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.');
          string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.');
          
          Output
          
          1100
          1100.1
          1100.1
          1100.1
          

          【讨论】:

            猜你喜欢
            • 2020-07-21
            • 1970-01-01
            • 1970-01-01
            • 2011-06-19
            • 1970-01-01
            • 2021-02-17
            • 1970-01-01
            • 1970-01-01
            • 2013-08-22
            相关资源
            最近更新 更多