Thanks for the reply.
I remember about the accuracy of floating point numbers.
It is encouraging that the "%g" can handle it.
format("%.17g", 123456.789123); // == 123456.789123
And we have a flag "#". As mentioned in documentation:
'#' floating Always insert the decimal point and print trailing
zeros.
With '#' I get:
format("%#.17g", 123456.789123); // == 123456.78912300000
So, with the flag '#' "%g" is almost similar to the "%f".
But there is no flag repealing '#' if it is enabled by default
(in the case of "%f").
I looked deeper into the function format and realized that my
question is more related to the implementation of snprintf. If I
understand correctly, snprintf does the job, and std.format
provides a safe and very convenient wrapper.
On Friday, 27 March 2015 at 17:08:07 UTC, Steven Schveighoffer
wrote:
On 3/27/15 11:02 AM, akaDemik wrote:
The task seemed very simple. But I'm stuck.
I want to:
1234567890123.0 to "1234567890123"
1.23 to "1.23"
1.234567 to "1.2346".
With format string "%.4f" i get "1.2300" for 1.23.
With "%g" i get "1.23456789e+12" for "1234567890123.0".
I can not believe that it is not implemented. What did I miss?
I think you are asking for trouble to do this. Floating point
is not exact, so for example, if I do
writefln("%.15f", 123456.789123);
I get:
123456.789122999995016
How far do you want to go before you determine there will only
be zeros? It could be infinity.
I'd say your best bet is to format to the max level you want,
e.g. "%.6f"
Then trim off any trailing zeros (and decimal point if
necessary) after conversion to a string.
-Steve