Print leading zeros with C++ output operator?
c++, formatting, numbers
Solution
This will do the trick, at least for non-negative numbers(a) such as the ZIP codes(b) mentioned in your question.
#include <iostream>
#include <iomanip>
using namespace std;
cout << setw(5) << setfill('0') << zipCode << endl;
// or use this if you don't like 'using namespace std;'
std::cout << std::setw(5) << std::setfill('0') << zipCode << std::endl;
The most common IO manipulators that control padding are:
- `std::setw(width)` sets the width of the field.
- `std::setfill(fillchar)` sets the fill character.
- `std::setiosflags(align)` sets the alignment, where align is ios::left or ios::right.
And just on your preference for using `<<`, I'd strongly suggest you look into the `fmt` library (see https://github.com/fmtlib/fmt). This has been a great addition to our toolkit for formatting stuff and is much nicer than massively length stream pipelines, allowing you to do things like:
cout << fmt::format("{:05d}", zipCode);
And it's currently being targeted by LEWG toward C++20 as well, meaning it will hopefully be a base part of the language at that point (or almost certainly later if it doesn't quite sneak in).
(a) If you do need to handle negative numbers, you can use `std::internal` as follows:
cout << internal << setw(5) << setfill('0') << zipCode << endl;
This places the fill character between the sign and the magnitude.
(b) This ("all ZIP codes are non-negative") is an assumption on my part but a reasonably safe one, I'd warrant :-)
Problem
How can I format my output in C++? In other words, what is the C++ equivalent to the use of `printf` like this: ``` printf("%05d", zipCode); ``` I know I could just use `printf` in C++, but I would prefer the output operator `<<`. Would you just use the following? ``` std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl; ```