Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Format decimal with commas, preserve trailing zeros

I'd like to convert a decimal to a string, with commas as thousands seperators, and preserve the same precision the decimal was created with. (Will have 2-5 significant digits)

        decimal d = 1234.4500M;

        //I'd like "1,234.4500"

        var notRight = d.ToString("###,###.#######");     //1,234.45
        var alsoNotRight = d.ToString("###,###.00000");;  //1,234.45000
        var notRightEither = d.ToString("N");    //1,234.45
        var notRightEither2 = d.ToString("G");   //1234.45000

Is there no built in way to do this without parsing the string manually? If there is no single format string, what's the easiest way to do this?

like image 584
foson Avatar asked Jun 14 '12 16:06

foson


1 Answers

According to the documentation, a decimal number preserves the trailing zeros. You can display them if you use the "G" specifier or no specifier at all. They are lost when you use one of the specifiers that includes a thousand separator.

If you want to specify the number of trailing zeros when converting to string, you can do it by adding a precision specifier (0 to 99 digits) after the format character, like this:

decimal d=1234.45M;
var numberAsString=d.ToString("N4");

The result will be

 1,234.4500

UPDATE: You can get the number of decimal digits using the Decimal.GetBits method which returns the binary representation of the number. The number of decimals is stored in bits 16-23 (third byte) of the fourth element.

The fourth element of the returned array contains the scale factor and sign. It consists of the following parts:

...

Bits 16 to 23 must contain an exponent between 0 and 28, which indicates the power of 10 to divide the integer number.

Getting a string representation using all digits can be done like this:

decimal d=1234.45000M;
var nums=Decimal.GetBits(d);
var decimals=BitConverter.GetBytes(nums[3])[2];
var formatStr="N"+decimals;
d.ToString(formatStr);

which will produce

1,234.45000
like image 116
Panagiotis Kanavos Avatar answered Sep 30 '22 18:09

Panagiotis Kanavos