从十进制值的末尾删除0

16

我有一个十进制值,小数点后面的数字是可变的,例如:

0.0030
0.0310
0.0001
1.1200

我该如何编写一个动态函数,以去除十进制数末尾的0?

7个回答

34

你也可以修改小数本身,这样任何ToString()方法都会给你想要的结果(更多详细信息请参见我的答案这里):

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

8
这个答案很棒,因为与其他回答(甚至整个主题)不同的是它实际上能够起作用并满足提问者的要求。看到这么多高声望的用户匆忙回答而没有阅读/理解问题并从一个根本不起作用的内容中获得所有赞,有点可耻。 - Coxy

21
string.Format("{0:0.#####}", 0.0030)
或者
var money=1.3000m;
money.ToString("0.#####");

为了以后的参考,我建议使用John Sheehan编写的.NET格式字符串快速参考


2
是的,但是如果你可能有6或7个小数位呢?这将导致一个充满 # 字符的猜测性巨大且丑陋的错误。 - Andrew M
2
这将把数字四舍五入到最接近的十万分之一。这可能是或可能不是OP想要的。 - BlueRaja - Danny Pflughoeft
3
@andrew-m 是的,# 是数字占位符。在大多数情况下,您知道所需的精度是什么。如果不知道并想要绝对确定,可以使用当前使用的数据类型的完整精度。decimal 可以容纳 28-29 个有效数字。巧妙的解决方案:.ToString("0.".PadRight(29,'#')) - Jonas Elfström
@BlueRaja 是正确的,我使用了五个 #,因为他的示例中有四位小数。 - Jonas Elfström
谢谢Jonas,这是一个很好的解决方案,在尝试了很多方法后终于找到了!(当有5或6个小数位时,它不会将数字转换为科学计数法) - Jill

9
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

3

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

您需要查看代码中何处出现尾随零。是在调用.ToString()之后吗?尝试使用不同的格式字符串进行实验:

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

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


2
decimal m = 0.030000m;
Console.Write(m.ToString("0.##########"));

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


0
我使用以下代码。它确保任何小数(最大精度为29位小数)将显示所有可用的精度数字,而无需尾随零,并且您的代码不需要具有一长串丑陋的井号字符串。
if (value is Decimal)
   value = ((Decimal)value).ToString("0.".PadRight(29, '#'), culture);

-1
 public static string GentlyRemoveEndZeros(string input)
        {
          //  if (input == null) return null;
          //  if (input == "") return "";
            if (input.Contains(".")) return input.TrimEnd('0').TrimEnd('.');
            return input;
        }

1
其他不使用“.”的语言环境怎么办? - Martin Mulder
@MartinMulder 同样的方式:如果(input.Contains(“,”)),则返回 input.TrimEnd('0')。TrimEnd(','); - VovaM
1
@VovaN:没错,但你的答案应该是跨文化通用的,不是吗? - Martin Mulder

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