Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set precision dynamically using sprintf

Using sprintf and the general syntax "%A.B" I can do this:

double a = 0.0000005l;
char myNumber[50];
sprintf(myNumber,"%.2lf",a);

Can I set A and B dynamically in the format string?

like image 734
siwmas Avatar asked Jun 23 '15 09:06

siwmas


2 Answers

Yes, you can do that. You need to use an asterisk * as the field width and .* as the precision. Then, you need to supply the arguments carrying the values. Something like

  sprintf(myNumber,"%*.*lf",A,B,a);

Note: A and B need to be type int. From the C11 standard, chapter §7.21.6.1, fprintf() function

... a field width, or precision, or both, may be indicated by an asterisk. In this case, an int argument supplies the field width or precision. The arguments specifying field width, or precision, or both, shall appear (in that order) before the argument (if any) to be converted. A negative field width argument is taken as a - flag followed by a positive field width. A negative precision argument is taken as if the precision were omitted.

like image 156
Sourav Ghosh Avatar answered Sep 21 '22 18:09

Sourav Ghosh


Yes - You use "*" e.g.

sprintf(mynumber, "%.*lf", 2, a);

See http://linux.die.net/man/3/sprintf

like image 44
Ed Heal Avatar answered Sep 19 '22 18:09

Ed Heal