3

在 Java 中,您可以使用BigDecimal.stripTrailingZeros()在末尾删除任何多余的零。

我在这里阅读了一些关于如何在 C# 中从小数中去除尾随零的问题,但它们似乎都没有提供正确的解决方案。

这个问题例如做 ToString("G") 的答案并不总是有效。

理想情况下,我想要一个执行小数 -> 小数的函数,新的小数具有尽可能小的比例,而不会丢失任何信息或删除任何尾随零。

有什么方法可以轻松做到这一点?还是会涉及摆弄decimal.GetBits()

编辑:还应该补充一点,我有 i18n 担心因此对结果进行字符串操作并不理想,因为小数分隔符存在差异。

4

3 回答 3

2

怎么样Decimal.Parse(d.ToString("0.###########################"))

于 2011-02-21T16:05:52.693 回答
1

这是我想出的(疯狂的代码,但运行顺利)

private decimal Normalize(decimal d)
{
    string[] tmp = d.ToString().Split('.');
    string val = tmp[0];    
    string fraction = null;
    decimal result;
    if(tmp.Length > 1) fraction = tmp[1];
    if(fraction != null && Getleast(fraction) > 0) 
    {
        decimal.TryParse(val.ToString() + "." + fraction.TrimEnd('0').ToString(),out result);
    }
    else
    {
        return decimal.Parse(val);
    }
    return result;
}

private decimal Getleast(string str)
{
    decimal res;
    decimal.TryParse(str.TrimEnd('0'),out res);// It returns 0 even if we pass null or empty string
    return res;
}

这是示例输入:

Console.WriteLine(Normalize(0.00M));
Console.WriteLine(Normalize(0.10M));
Console.WriteLine(Normalize(0001.00M));
Console.WriteLine(Normalize(1000.01M));
Console.WriteLine(Normalize(1.00001230M));
Console.WriteLine(Normalize(0031.200M));        
Console.WriteLine(Normalize(0.0004000M));
Console.WriteLine(Normalize(123));

以及各自的输出:

0
0.1
1
1000.01
1.0000123
31.2
0.0004
123
于 2011-02-21T14:55:10.217 回答
0

不是最优雅的解决方案,但它应该可以满足您的一切需求。

 private decimal RemoveTrailingZeros(decimal Dec)
    {
        string decString = Dec.ToString();

        if (decString.Contains("."))
        {
            string[] decHalves = decString.Split('.');

            int placeholder = 0, LoopIndex = 0;

            foreach (char chr in decHalves[1])
            {
                LoopIndex++;
                if (chr != '0')
                    placeholder = LoopIndex;
            }

            if (placeholder < decHalves[1].Length)
                decHalves[1] = decHalves[1].Remove(placeholder);

            Dec = decimal.Parse(decHalves[0] + "." + decHalves[1]);
        }

        return Dec;
    }

固定版本,感谢 Shekhar_Pro!

于 2011-02-21T16:00:12.270 回答