使系统正常化.十进制带后面的零

本文关键字:系统 正常化 十进制 | 更新日期: 2023-09-27 18:06:31

我有一种非常紧凑的方法来删除十进制值中的尾零,但我更喜欢一种不涉及字符串往返的方法,就像我目前所做的那样。这是我目前的解决方案:

var value = 0.010m;
value = decimal.Parse(value.ToString("G29"));
Console.WriteLine(value); // prints 0.01 (not 0.010)

所以它有效,但是你有更好的方法吗?

另外,作为次要问题是decimalValue.ToString() 100%符合xs:decimal吗?

使系统正常化.十进制带后面的零

数字存储为多少SF并不重要,重要的是输出时发生了什么。

// The number of #'s is the number of decimal places you want to display
Console.WriteLine(value.ToString("0.###############");
// Prints 0.01

回答你的第二个问题,System.XmlConvert.ToString(decimal value) 100%符合xs:decimal。

这个应该稍微快一点。

public static decimal StripTrailingZeroes(this decimal value)
{
    return decimal.Parse(value.ToString("G29", CultureInfo.InvariantCulture), CultureInfo.InvariantCulture);
}

这是一个新的想法:

public static class DecimalEx
{
    public static decimal Fix(this decimal value)
    {
        var x = value;
        var i = 28;
        while (i > 0)
        {
            var t = decimal.Round(x, i);
            if (t != x)
                return x;
            x = t;
            i--;
        }
        return x;
    }
}

这可能就行了。但是非常粗糙。需要测试和简化

cast to double and back to decimal应该可以工作。

decimal fixDecimal(decimal number) => (decimal)(double)number;