printf の書式は分かるのに std::cout で桁揃えする方法を思い出せないときに見るエントリ
概要
printf の書式はソラで書けるけど std::cout で同じことをする方法が出てこない俺のためのチートシート。特に std::format が使えない環境のための覚書。
書式
#include <iostream>
#include <iomanip> // std::setw, std::setfill
#include <bitset> // std::hex
#include <format> // C++20
int i = 123;
// Output: "i = 123(0x007b)"
printf("i = %4d(0x%04x)\n", i, i);
std::cout << "i = " << std::setfill(' ') << std::setw(4) << i << "(0x" << std::setfill('0') << std::setw(4) << std::hex << i << ")" << std::endl;
std::cout << std::format("i = {:4d}(0x{:04x})", i, i) << std::endl; // C++20
double d = 12.345;
// Output: "d = 012.35"
printf("d = %06.2f\n", d);
std::cout << "d = " << std::setfill('0') << std::setw(6) << std::fixed << std::setprecision(2) << d << std::endl;
std::cout << std::format("d = {:06.2f}", d) << std::endl; // C++20
補足
- 左寄せ, 両寄せを使用する場合は #include して std::left, std::right, std::internal を適宜追加
- std::showbase を使用すると std::setw の値が読みにくくなるので使わない
- std::format は同じ引数を複数回参照できるが読みにくくなるので使わない
- 空白埋めだけでよいなら std::setfill は不要
- 末尾の改行なしで即時出力したいなら std::endl の代わりに std::flush を使う