7

I have some old C code I'm trying to replicate the behavior of in C++. It uses the printf modifiers: "%06.02f".

I naively thought that iomanip was just as capable, and did:

cout << setfill('0') << setw(6) << setprecision(2)

When I try to output the test number 123.456, printf yields:

123.46

But cout yields:

1.2+e02

Is there anything I can do in iomanip to replicate this, or must I go back to using printf?

[Live Example]

Jonathan Mee
  • 37,899
  • 23
  • 129
  • 288
  • Try taking a look at boost::format(). It supports printf() type syntax for iostreams and is type safe. – Jon Trauntvein Dec 14 '15 at 20:51
  • @JonTrauntvein While I appreciate the tip (especially since tons of stuff in boost eventually makes it's way into the standard) I don't include boost wherever possible. And here it seems possible not to include it. – Jonathan Mee Dec 16 '15 at 16:41

2 Answers2

4

Try std::fixed:

std::cout << std::fixed;

Sets the floatfield format flag for the str stream to fixed.

When floatfield is set to fixed, floating-point values are written using fixed-point notation: the value is represented with exactly as many digits in the decimal part as specified by the precision field (precision) and with no exponent part.

AlexD
  • 32,156
  • 3
  • 71
  • 65
2

The three C format specifiers map to corresponding format setting in C++ IOStreams:

  • %f -> std::ios_base::fixed (fixed point notation) typically set using out << std::fixed.
  • %e -> std::ios_base::scientific (scientific notation) typically set using out << std::scientific.
  • %g -> the default setting, typically set using out.setf(std::fmtflags(), std::ios_base::floatfield) or with C++11 and later out << std::defaultfloat. The default formatting is trying to yield the "best" of the other formats assuming a fixed amount of digits to be used.

The precision, the width, and the fill character match the way you already stated.

Dietmar Kühl
  • 150,225
  • 13
  • 225
  • 380