c# how to String.Format decimal with unlimited decimal places?

前端 未结 3 1437
醉梦人生
醉梦人生 2020-12-06 18:18

I need to convert a decimal number to formatted string with thousand groups and unlimited (variable) decimal numbers:


    1234 -> \"1,234\"
    1234.567 -> \"1,2         


        
相关标签:
3条回答
  • 2020-12-06 18:46

    As I've said, the decimal type has a precision of 28-29 digits.

    decimal mon = 1234.12345678901234567890123M;
    var monStr = mon.ToString("#,0.##############################");
    var monStr2 = String.Format("{0:#,0.##############################}", mon);
    

    Here there are 30x# after the decimal separator :-)

    I've changed one # with 0 so that 0.15 isn't written as .15 .

    0 讨论(0)
  • 2020-12-06 19:02

    You can use # multiple times (see Custom Numeric Format Strings):

    string.Format("{0:#,#.#############################}", decimalValue)
    

    Or, if you're just formatting a number directly, you can also just use decimal.ToString with the format string.

    However, there is no way to include "unlimited decimal numbers". Without a library supporting arbitrary precision floating point numbers (for example, using something like BigFloat from Extreme Numerics), you'll run into precision issues eventually. Even the decimal type has a limit to its precision (28-29 significant digits). Beyond that, you'll run into other issues.

    0 讨论(0)
  • 2020-12-06 19:09

    this should do the trick

    string DecimalToDecimalsString(decimal input_num)
            {            
                decimal d_integer = Math.Truncate(input_num); // = 1234,0000...
                decimal d_decimals = input_num-d_integer; // = 0,5678...
    
                while (Math.Truncate(d_decimals) != d_decimals)
                    d_decimals *= 10; //remove decimals
    
                string s_integer = String.Format("{0:#,#}", d_integer);
                string s_decimals = String.Format("{0:#}", d_decimals);
    
                return s_integer + "." + s_decimals;
            }
    

    replacing decimal with other types should work too.

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