[Boost-users] [format] print float number with fixed number of decimals *and* integer digits

978 views
Skip to first unread message

alfC

unread,
Sep 30, 2010, 7:21:37 PM9/30/10
to boost...@lists.boost.org
I always found the rules for printf formatting, which Boost.Format
uses, cryptic. I usually find the right combination by trial and
error. In this case I want to print decimal numbers with both fixed
number of integer digits and decimal digits. How can I do this with
Boost.Format.

#include<boost/format.hpp>
#include<iostream>
int main(){
int i = 2;
std::cout << boost::format("%04i") % i << std::endl; //prints 0002,
ok!
double d = 3.1415;
std::cout<< boost::format("%04.8f") % d << std::endl;
// ^ prints 3.14150000,
// want 0003.14150000
//(or even ' 3.14150000')
//(or even ' 3.1415 ')
return 0;
}

Thank you,
Alfredo

_______________________________________________
Boost-users mailing list
Boost...@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users

Larry

unread,
Sep 30, 2010, 8:41:42 PM9/30/10
to boost...@lists.boost.org, alfredo...@gmail.com
I believe if you use something like "%015.8lf" you will get more of what you
want.
I always think that the .8 is the number of digits to the right of decimal
and the 15
is the entire field width (including sign, any leading zero digits, any
digits to the left
of the decimal, the decimal point, and digits to the right of decimal
point). For
example:

double pi(3.141592);

format a("%015.8lf");
a % pi;
printf("%s\n",a.str().c_str());

prints:

000003.14159200

Larry

Alfredo Correa

unread,
Sep 30, 2010, 9:33:57 PM9/30/10
to boost...@lists.boost.org
On Thu, Sep 30, 2010 at 5:41 PM, Larry <lkn...@nc.rr.com> wrote:
> I believe if you use something like "%015.8lf" you will get more of what you
> want.
> I always think that the .8 is the number of digits to the right of decimal
> and the 15
> is the entire field width (including sign, any leading zero digits,  any
> digits to the left
> of the decimal, the decimal point, and digits to the right of decimal
> point).

Right, I though that the number before the dot . was the number of
integer digits not the total number of digits.

std::cout<< boost::format("%015.8f") % d << std::endl;

works, prints 000003.14150000

Thank you,
Alfredo

Larry

unread,
Sep 30, 2010, 10:45:52 PM9/30/10
to boost...@lists.boost.org, alfredo...@gmail.com
I don't know the origin of the specification although I suspect it may have
come from or been influenced by FORTRAN (or maybe COBOL although I have
forgotten anything I knew about COBOL). FORTRAN has always done it this way
and it predates C and C++ by a few years (doesn't make it right, I know):
that is, the "15" is the field width and the ".8" is the number of decimal
digits. It sort of makes sense. In the %04d case 4 is the field width with
perhaps an implied .0 since integers by definition have no decimal part. You
can, of course, specify %04.0lf and will get an integer representation of a
double value with a field width of 4.
Reply all
Reply to author
Forward
0 new messages