开发者

How to String.Format decimal with unlimited decimal places?

开发者 https://www.devze.com 2023-04-13 08:42 出处:网络
I need to convert a decimal number to formatted string with thousand groups and unlimited (variable) decimal numbers:

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

1234 -> "1,234"
1234.567 -> "1,234.567&qu开发者_高级运维ot;
1234.1234567890123456789 -> "1,234.1234567890123456789"

I tried String.Format("{0:#,#.#}", decimal), but it trims any number to max 1 decimal place.


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.


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 .


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

精彩评论

暂无评论...
验证码 换一张
取 消