从十进制值的末尾删除0

时间:2010-01-21 13:28:34

标签: c# decimal

我有一个小数值,在.之后有一个可变位数,例如:

0.0030
0.0310
0.0001
1.1200

如何编写一个在小数结尾处删除0的动态函数?

8 个答案:

答案 0 :(得分:25)

您还可以修改小数本身,以便任何ToString()都能为您提供所需的内容 (我的回答here中的更多细节):

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

答案 1 :(得分:20)

string.Format("{0:0.#####}", 0.0030)

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

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

答案 2 :(得分: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 :(得分:3)

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

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

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

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

答案 4 :(得分:2)

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

确保您有足够的#s表示要显示的小数位数

答案 5 :(得分:0)

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

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

答案 6 :(得分:-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;
        }

答案 7 :(得分:-2)

截断尾随零非常容易,使用双面转换解析:

    decimal mydecimal = decimal.Parse("1,45000000"); //(I)
    decimal truncate = (decimal)(double)mydecimal;   //(II)

(I) - >从任何字符串源解析十进制值。

(II) - >首先:强制转换为双倍删除尾随零。第二:其他强制转换为十进制,因为不存在从十进制到双精度的隐式转换,反之亦然)