(first post here )
With printf you can add zeroes to the output by specifying %03d like this:
int x = 123;
printf("%06d\n", x); => will print 000123
How can this be achieved with floats? (if it's possible)
(first post here )
With printf you can add zeroes to the output by specifying %03d like this:
int x = 123;
printf("%06d\n", x); => will print 000123
How can this be achieved with floats? (if it's possible)
You can't, not just using printf's format specifiers anyway. At least not to the left of the decimal point. You can only specify to the right of the decimal point.
Quzah.Code:printf("%.3f", 1.0 );
Hope is the first step on the road to disappointment.
Code:#include <stdio.h> int main(void) { float value = 1.0F; printf("value = %07.3f\n", value); return 0; } /* my output value = 001.000 */
7. It is easier to write an incorrect program than understand a correct one.
40. There are two ways to write error-free programs; only the third one works.*
But Dave's response wouldn't work with this number
I am sure Dave knew this, I am just pointing it out.Code:#include <stdio.h> int main(void) { float value = 1000000.0F; printf("value = %07.3f\n", value); return 0; } /* my output value = 000.000 */
Help populate a c/c++ help irc channel
server: irc://irc.efnet.net
channel: #c
That's rather interesting. Run this:
Dave, change your seven to a three and watch it break. Hell, change it to a 6 and watch it break. I'm not sure what exactly you're trying to say there, because "7" does not give you seven points of precision like it would if it were an integer. The point is, it doesn't work right, and in fact, it isn't even guarinteed that it will work right. Reading the man pages, they only specify that to the right of the decimal point will work.Code:#include <stdio.h> int main( void ) { printf("%03.3f", 1.1 ); return 0; } /* My output: 1.100 */
Quzah.
Hope is the first step on the road to disappointment.
> printf("%03.3f", 1.1 );
The first 3 represents the total field width.
Looks like you learn something new every .... well, once in a while anyway. I was thinking it was places left and places right respectively. On an aside, the man pages do say it only works to the right.Originally Posted by swoopy
[edit]
Here was my misunderstanding.An optional precision, in the form of a period
(`.') followed by an optional digit string. If
the digit string is omitted, the precision is taken
as zero. This gives the minimum number of digits
to appear for d, i, o, u, x, and X conversions, the
number of digits to appear after the decimal-point
for e, E, and f conversions, the maximum number of
significant digits for g and G conversions, or the
maximum number of characters to be printed from a
string for s conversions.
[/edit]
Quzah.
Last edited by quzah; 06-15-2004 at 05:45 PM.
Hope is the first step on the road to disappointment.
"Undefined" is the word missing from this thread.
0 For d, i, o, u, x, X, e, E, f, g and G conversions, leading zeros
(following any indication of sign or base) are used to pad to the
field width; no space padding is performed. If the 0 and - flags
both appear, the 0 flag will be ignored. For d, i, o, u, x and X
conversions, if a precision is specified, the 0 flag will be
ignored. For other conversions, the behavior is undefined.
When all else fails, read the instructions.
If you're posting code, use code tags: [code] /* insert code here */ [/code]
Yeah. I thought I at least half way knew what I was talking about. I just didn't see it when looking for it a second time...
Quzah.
Hope is the first step on the road to disappointment.
Of course if you have something like:
Even though it's five wide, at least it doesn't truncate it.Code:printf("%03.3f\n",1.125);
Hammer, can you explain that in English.
Width specifiers only give you the minimum width. (As with integers. It only gives you a guarinteed minimum width, but if your number is larger, it will not truncate.) So, assuming it was all defined behaviour, the value to the left would be the total guarinteed minimum width, and the value to the right of the decimal point, would be the guarinteed maximum width for everything to the right of the decimal point, truncating anything that would have been longer on the right of the decimal point. But, the entire width would have a minimum guarinteed width based on whatever was left. Assuming defined behaviour.
Quzah.
Hope is the first step on the road to disappointment.
Well, my take on the bolded part in my post is that using the following things in one go is "undefined":
- 0 flag (to give you leading zeros)
- .3 (precision)
- f (to give you a float)
Looking at chrismiceli's post (4th in the thread), they say that the sample code gives output of "000.000", however, when I compile/run it, I get "1000000.000". Assuming chrismiceli did actually compile/run the code to get the result, I guess we're seeing the affects of undefined behaviour. If this is the case, I'd be interested to know what compiler is being used, and what are the results when the following is used in the same program:
printf("value = %07f\n", value);
When all else fails, read the instructions.
If you're posting code, use code tags: [code] /* insert code here */ [/code]
Ok, based on what you both are saying, it would indeed be interesting if chrismiceli were to run:
printf("value = %07f\n", value);
If it prints properly, then we are interpreting the standard correctly, and if you want portable code, you can't specify a precision with %0:
printf("value = %07.3f\n", value);
First, let me apologize for being a bit sloppy (less sleep and more diaper changes have been the order of the day for over a week now). I was trying to present a possibility for "How can this be achieved with floats? (if it's possible)". I may have erred, but it did seem to me possible.
I'm a bit tired, but the responses thus far are thought-provoking. One thing that I find of interest is this.It isn't "d, i, o, u, x and X" or some "other" conversion, it is the f conversion.Originally Posted by Hammer
I believe C99 and certain other implementations fix some of the shortcomings with snprintf.
Again, I'm a bit tired. But I am interested in more rested follow-ups.
7. It is easier to write an incorrect program than understand a correct one.
40. There are two ways to write error-free programs; only the third one works.*