Best way to display decimal without trailing zeroes

前端 未结 14 1389
终归单人心
终归单人心 2020-11-27 04:49

Is there a display formatter that will output decimals as these string representations in c# without doing any rounding?

// decimal -> string

20 -> 20         


        
相关标签:
14条回答
  • 2020-11-27 04:55

    Extension method:

    public static class Extensions
    {
        public static string TrimDouble(this string temp)
        {
            var value = temp.IndexOf('.') == -1 ? temp : temp.TrimEnd('.', '0');
            return value == string.Empty ? "0" : value;
        }
    }
    

    Example code:

    double[] dvalues = {20, 20.00, 20.5, 20.5000, 20.125, 20.125000, 0.000};
    foreach (var value in dvalues)
        Console.WriteLine(string.Format("{0} --> {1}", value, value.ToString().TrimDouble()));
    
    Console.WriteLine("==================");
    
    string[] svalues = {"20", "20.00", "20.5", "20.5000", "20.125", "20.125000", "0.000"};
    foreach (var value in svalues)
        Console.WriteLine(string.Format("{0} --> {1}", value, value.TrimDouble()));
    

    Output:

    20 --> 20
    20 --> 20
    20,5 --> 20,5
    20,5 --> 20,5
    20,125 --> 20,125
    20,125 --> 20,125
    0 --> 0
    ==================
    20 --> 20
    20.00 --> 2
    20.5 --> 20.5
    20.5000 --> 20.5
    20.125 --> 20.125
    20.125000 --> 20.125
    0.000 --> 0
    
    0 讨论(0)
  • 2020-11-27 04:55

    I have end up with this variant:

    public static string Decimal2StringCompact(decimal value, int maxDigits)
        {
            if (maxDigits < 0) maxDigits = 0;
            else if (maxDigits > 28) maxDigits = 28;
            return Math.Round(value, maxDigits, MidpointRounding.ToEven).ToString("0.############################", CultureInfo.InvariantCulture);
        }
    

    Advantages:

    you can specify the max number of significant digits after the point to display at runtime;

    you can explicitly specify a round method;

    you can explicitly control a culture.

    0 讨论(0)
  • 2020-11-27 04:56

    I ended up with the following code:

        public static string DropTrailingZeros(string test)
        {
            if (test.Contains(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
            {
                test = test.TrimEnd('0');
            }
    
            if (test.EndsWith(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
            {
                test = test.Substring(0,
                    test.Length - CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator.Length);
            }
    
            return test;
        }
    
    0 讨论(0)
  • 2020-11-27 04:57

    I just learned how to properly use the G format specifier. See the MSDN Documentation. There is a note a little way down that states that trailing zeros will be preserved for decimal types when no precision is specified. Why they would do this I do not know, but specifying the maximum number of digits for our precision should fix that problem. So for formatting decimals, G29 is the best bet.

    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
    
    0 讨论(0)
  • 2020-11-27 04:59

    This string format should make your day: "0.#############################". Keep in mind that decimals can have at most 29 significant digits though.

    Examples:

    ? (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
    
    0 讨论(0)
  • 2020-11-27 05:03

    This is yet another variation of what I saw above. In my case I need to preserve all significant digits to the right of the decimal point, meaning drop all zeros after the most significant digit. Just thought it would be nice to share. I cannot vouch for the efficiency of this though, but when try to achieve aesthetics, you are already pretty much damned to inefficiencies.

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

    That's all, just wanted to throw in my two cents.

    0 讨论(0)
提交回复
热议问题