显示小数而不带尾随零的最佳方法

JC.*_*JC. 97 c# formatting decimal

是否有一个显示格式化程序,它将在c#中输出小数作为这些字符串表示而不进行任何舍入?

// decimal -> string

20 -> 20
20.00 -> 20
20.5 -> 20.5
20.5000 -> 20.5
20.125 -> 20.125
20.12500 -> 20.125
0.000 -> 0
Run Code Online (Sandbox Code Playgroud)

{0.#}将舍入,并且使用某些Trim类型函数将无法使用网格中的绑定数字列.

Tob*_*oby 136

您是否需要显示最大小数位数?(您的示例最多为5).

如果是这样,我认为格式化为"0.#####"会做你想要的.

    static void Main(string[] args)
    {
        var dList = new decimal[] { 20, 20.00m, 20.5m, 20.5000m, 20.125m, 20.12500m, 0.000m };

        foreach (var d in dList)
            Console.WriteLine(d.ToString("0.#####"));
    }
Run Code Online (Sandbox Code Playgroud)

  • @TrueWill实际上它确实有所作为.d == 0.1m然后"0.#"呈现"0.1"而"#.#"呈现".1"而没有前导0.无论是错还是正确,只取决于你想要什么. (13认同)
  • 并且你总是可以在格式中输出过多的#符号.*不科学 (4认同)
  • 我需要一直显示一个小数位,所以我使用了格式字符串`"0.0#"`. (4认同)
  • +1 - 顺便说一下,你不需要领先#."0.#####"的作用相同.无论哪种方式,这都会从零开始(仅限FYI). (3认同)

Sch*_*lls 30

我刚学会了如何正确使用G格式说明符.请参阅MSDN文档.有一点注意说明当没有指定精度时,将为十进制类型保留尾随零.为什么他们会这样做我不知道,但指定我们的精度的最大位数应解决这个问题.因此,对于格式化小数,G29是最好的选择.

decimal test = 20.5000m;
test.ToString("G"); // outputs 20.5000 like the documentation says it should
test.ToString("G29"); // outputs 20.5 which is exactly what we want
Run Code Online (Sandbox Code Playgroud)

  • 这将导致0.00001显示为1E-05 (21认同)

Erw*_*yer 16

这种字符串格式应该是你的日子:"0.#############################".请记住,小数最多可以包含29位有效数字.

例子:

? (1000000.00000000000050000000000m).ToString("0.#############################")
-> 1000000.0000000000005

? (1000000.00000000000050000000001m).ToString("0.#############################")
-> 1000000.0000000000005

? (1000000.0000000000005000000001m).ToString("0.#############################")
-> 1000000.0000000000005000000001

? (9223372036854775807.0000000001m).ToString("0.#############################")
-> 9223372036854775807

? (9223372036854775807.000000001m).ToString("0.#############################")
-> 9223372036854775807.000000001
Run Code Online (Sandbox Code Playgroud)

  • 这是该问题最常见的答案.不知道为什么这不是十进制的默认"G"格式.尾随零不添加任何信息.Microsoft文档对十进制有一个奇怪的警告:https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings#GFormatString但是,如果数字是十进制,则省略精度说明符,始终使用定点表示法并保留尾随零. (4认同)

dys*_*oko 9

这是我在上面看到的另一种变化.在我的情况下,我需要保留小数点右侧的所有有效数字,意味着在最高有效数字后丢弃全零.只是觉得分享会很好.我不能保证这个效率,但是当试图实现美学时,你已经非常愚蠢到低效率.

public static string ToTrimmedString(this decimal target)
{
    string strValue = target.ToString(); //Get the stock string

    //If there is a decimal point present
    if (strValue.Contains("."))
    {
        //Remove all trailing zeros
        strValue = strValue.TrimEnd('0');

        //If all we are left with is a decimal point
        if (strValue.EndsWith(".")) //then remove it
            strValue = strValue.TrimEnd('.');
    }

    return strValue;
}
Run Code Online (Sandbox Code Playgroud)

这就是全部,只是想投入我的两分钱.

  • 这很容易就是最好的解决方案,它也不会爆炸为"0.0".我添加了一个默认标志,使整数可选地显示为"1.0",这只是使我的所有小数都落入了行.无法理解为什么这不是最好的答案,+很多. (3认同)
  • 如果有人已经通过你一个字符串,这是特别好的.您可以将其更改为ToTrimmedString(此字符串strValue)并删除第一行. (2认同)

Dav*_*tal 5

另一种解决方案,基于dyslexicanaboko的回答,但独立于当前的文化:

public static string ToTrimmedString(this decimal num)
{
    string str = num.ToString();
    string decimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
    if (str.Contains(decimalSeparator))
    {
        str = str.TrimEnd('0');
        if(str.EndsWith(decimalSeparator))
        {
            str = str.RemoveFromEnd(1);
        }
    }
    return str;
}

public static string RemoveFromEnd(this string str, int characterCount)
{
    return str.Remove(str.Length - characterCount, characterCount);
}
Run Code Online (Sandbox Code Playgroud)