C++の入出力ストリームクラス(cout/iostream, stringstream等)で空白による右詰めや右詰め、ゼロ埋め(zero padding)を実現する方法を紹介します。事前にiosヘッダやiomanipヘッダをインクルードしておく必要があります。
#include <ios> // std::left, std::right
#include <iomanip> // std::setw(int), std::setfill(char)
右詰め
std::cout << std::right << std::setw(4) << 12; // " 12"
std::cout << std::right << std::setw(4) << -12; // " -12"
左詰め
std::cout << std::left << std::setw(4) << 12; // "12 "
std::cout << std::left << std::setw(4) << -12; // "-12 "
ゼロ埋め
std::cout << std::setfill('0') << std::right << std::setw(4) << 12; // "0012"
std::cout << std::setfill('0') << std::left << std::setw(4) << 12; // "1200"
std::cout << std::setfill(' '); // ゼロ埋め・解除(デフォルトに戻す)
文字揃え関連のマニピュレータについて
左寄せと右寄せはそれぞれstd::left
, std::right
マニピュレータを用いて行います。文字幅はstd::setw()
、詰めたい文字はstd::setfill()
で指定します(空白やゼロ以外の文字も指定できます)。
# 左詰め(std::left
)と# 右詰め(std::right
)それぞれのマニピュレータをstd::setfill('0')
やstd::setw(文字幅)
と組み合わせて利用することで# ゼロ埋めを実現することもできます。
以下は文字揃え関連のフォーマットでよく使われるマニピュレータです。それぞれのマニピュレータはiomanip
ヘッダーやios
ヘッダー、場合によってはiostream
ヘッダーを読み込むことで利用可能になります。
#include <ios>
std::left; // 左揃えで出力
std::right; // 右揃えで出力
std::internal; // 符号左揃え、数字右揃え
std::showpos; // 正の符号も出力
#include <iomanip>
std::setw(int); // 文字幅を指定
std::setfill(char); // 詰めたい文字を指定
std::cout << std::showpos << 9; // "+9"
std::cout << std::internal << std::setw(4) << -9; // "- 9"
std::cout << std::setfill('0') << std::right << std::setw(4) << -12; // "0-12"
std::cout << std::setfill('0') << std::internal << std::setw(4) << -12; // "-012"
マニピュレータ/フラグの解除
setw以外のマニピュレータではフラグの状態が引き継がれるため注意してください。設定された状態は次回の出力時にも影響します。setwについては、入出力ストリーム上に値を渡す度にゼロにリセットされます。
std::cout << std::left;
std::cout << std::showpos;
std::cout << std::setfill('_');
std::cout << std::setw(4) << 12; // "+12_"
std::cout << std::setw(4) << 12; // "+12_" (" 12"ではない)
std::cout << 12; // "+12" (符号が付いたままとなる。setwのみリセットされる)
以下の方法でデフォルトの状態に戻すことができます。
/* 解除 */
std::cout << std::right;
std::cout << std::noshowpos;
std::cout << std::setfill(' ');
std::cout << std::setw(0);
/* 確認 */
std::cout << 12; // "12"
std::cout << std::setw(4) << 12; // " 12"
std::cout << 12; // "12"
std::cout << std::setw(4);
std::cout << 12; // " 12"