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
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
.
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.
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.