【问题标题】:Remove 0s from the end of a decimal value [duplicate]从十进制值的末尾删除 0 [重复]
【发布时间】:2011-01-07 17:53:47
【问题描述】:

我有一个在. 后面有可变位数的十进制值,例如:

0.0030
0.0310
0.0001
1.1200

如何编写一个动态函数,去除小数点末尾的 0?

【问题讨论】:

    标签: c# decimal


    【解决方案1】:

    您还可以修改小数本身,以便任何 ToString() 都会给您想要的 (更多细节在我的回答here):

    public static decimal Normalize(decimal value)
    {
        return value/1.000000000000000000000000000000000m;
    }
    

    【讨论】:

    • 这个答案拥有,因为与这个问题(甚至整个主题)的基本上所有其他答案不同,它实际上是有效的,并且可以满足 OP 的要求。看到所有这些高级代表用户在没有阅读/理解问题的情况下急于回答并从甚至不起作用的东西中获得所有赞成票,这有点可耻。
    【解决方案2】:
    string.Format("{0:0.#####}", 0.0030)
    

    var money=1.3000m;
    money.ToString("0.#####");
    

    为了将来参考,我推荐 John Sheehan 的 .NET Format String Quick Reference

    【讨论】:

    • 是的,但是如果您可能有 6 个小数位或 7 个小数位怎么办?您最终会遇到 # 个字符的投机性大而丑陋的皮疹。
    • 这会将数字四舍五入到最接近的千分之一。这可能是也可能不是 OP 想要的..
    • @andrew-m 是的,# 是一个数字占位符。在大多数情况下,您知道所需的精度是多少。如果您不这样做并且想要绝对确定您可以使用您当前使用的数据类型的完整精度。 decimal 可以容纳 28-29 位有效数字。哈克解决方案:.ToString("0.".PadRight(29,'#'))
    • @BlueRaja True 我用了五个#,因为他的例子中有四个小数位。
    • 感谢 Jonas,在尝试了很多事情之后,这是一个很好的解决方案! (当有 5 或 6 位小数时,它不会将数字转换为科学计数法)
    【解决方案3】:
    decimal value = 0.0030m;
    value.ToString(“G29″);
    

    编辑:G 格式化程序确实有效,唯一的问题是如果原始十进制中有太多有效数字,它会跳转到科学计数法。不太理想。

    在此处查看“通用(“G”)格式说明符”文档:http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx#GFormatString

    我正在吃午饭,所以我做了一个小测试:

    decimal d1 = 0.000100m;
    decimal d2 = 0.001000000000000000000000m;
    decimal d3 = 0.000000000000001000000000m;
    
    Console.WriteLine(Environment.NewLine + "input decimal: 0.000100m");
    Console.WriteLine("G         " + d1.ToString("G"));
    Console.WriteLine("G29       " + d1.ToString("G29"));
    Console.WriteLine("0.####### " + d1.ToString("0.#######"));
    
    Console.WriteLine(Environment.NewLine + "input decimal: 0.001000000000000000000000m");
    Console.WriteLine("G         " + d2.ToString("G"));
    Console.WriteLine("G29       " + d2.ToString("G29"));
    Console.WriteLine("0.####### " + d2.ToString("0.#######"));
    
    Console.WriteLine(Environment.NewLine + "input decimal: 0.000000000000001000000000m");
    Console.WriteLine("G         " + d3.ToString("G"));
    Console.WriteLine("G29       " + d3.ToString("G29"));
    Console.WriteLine("0.####### " + d3.ToString("0.#######"));
    

    输出:

    input decimal: 0.000100m
    G         0.000100
    G29       0.0001
    0.####### 0.0001
    
    input decimal: 0.001000000000000000000000m
    G         0.001000000000000000000000
    G29       0.001
    0.####### 0.001
    
    input decimal: 0.000000000000001000000000m
    G         0.000000000000001000000000
    G29       1E-15
    0.####### 0
    

    【讨论】:

      【解决方案4】:

      嗯,这是一个显示格式问题(将小数转换为字符串时会添加零)。

      您需要查看您在代码中看到尾随零的位置。是在调用 .ToString() 之后吗?尝试使用不同的格式字符串:

      .ToString("#");
      .ToString("0.00");
      .ToString("#.##");
      

      等等。最好的方法就是尝试不同的可能值。

      【讨论】:

        【解决方案5】:
        decimal m = 0.030000m;
        Console.Write(m.ToString("0.##########"));
        

        只要确保你有足够的 #s 来显示你想要显示的小数位数

        【讨论】:

          【解决方案6】:

          我使用以下内容。它确保任何小数点(最大精度为 29 位小数)都将显示所有可用的精度数字,而没有尾随零,并且您的代码不需要长长的难看的哈希标记字符串。

          if (value is Decimal)
             value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture);
          

          【讨论】:

            【解决方案7】:
             public static string GentlyRemoveEndZeros(string input)
                    {
                      //  if (input == null) return null;
                      //  if (input == "") return "";
                        if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.');
                        return input;
                    }
            

            【讨论】:

            • 其他不使用“.”的语言环境呢?
            • @MartinMulder 同理: if (input.Contains(",")) return input.TrimEnd('0').TrimEnd(',');
            • @VovaN:没错,但你的答案不应该是跨文化的吗?
            猜你喜欢
            • 2012-06-28
            • 1970-01-01
            • 1970-01-01
            • 2020-02-05
            • 2016-01-06
            • 1970-01-01
            • 1970-01-01
            • 2016-11-24
            • 2019-01-04
            相关资源
            最近更新 更多