C# 规范化系统。十进制带尾随零

C# 规范化系统。十进制带尾随零,c#,format,decimal,C#,Format,Decimal,我有一种非常简洁的方法来删除十进制值中的尾随零,但我更喜欢一种不涉及字符串往返的方法,就像我目前所做的那样。这是我当前的解决方案: var value = 0.010m; value = decimal.Parse(value.ToString("G29")); Console.WriteLine(value); // prints 0.01 (not 0.010) 所以它是有效的,但是你有更好的方法吗 另外,第二个问题是decimalValue.ToString()100%符合xs:deci

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

var value = 0.010m;
value = decimal.Parse(value.ToString("G29"));
Console.WriteLine(value); // prints 0.01 (not 0.010)
所以它是有效的,但是你有更好的方法吗


另外,第二个问题是decimalValue.ToString()100%符合xs:decimal?

回答第二个问题,
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);
}

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

试一试


这里有一个新的想法:

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;
    }
}

这可能就行了。但是它很粗糙。需要测试并简化它。

-当然,我可以反复截断和比较小数,直到值不再相等。至少(0.010m==0.01m)相关问题:最好的方法是使用Jon对相同问题的回答:谢谢Gabe&Thomas。这看起来就像我正在寻找的一样,虽然需要很多代码,但我会接受它。:-)可能重复的-这也有一个很好的答案:@Bent-对不起,我不能帮助解决原来的问题-我做了半次尝试来弄清楚
十进制
是如何工作的;它的文档记录得很差,修改
int[4]
表示法似乎很棘手。我会将此作为一种扩展方法,并在以后遇到问题时对其进行优化;很可能这不是一个大的性能打击(听起来像过早优化)。我用最快的字符串往返法编辑了我的问题,应该是什么。这只是“我脑海中的碎片”问题:它不应该改变表示为字符串来去除尾随的零,所以它困扰着我,但你是非常正确的,它应该是正确的,这是最重要的。我知道它也会困扰我。看看我的一些字符串操作答案——我讨厌用字符串做事情。
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;
    }
}