【C++】右詰め/右詰め/ゼロ埋めの方法と注意点【cout】


C++のストリームクラス(cout, stringstream等)で空白による右詰め右詰めやゼロ埋め(zero padding)を実現する方法です。

事前にiomanipヘッダをインクルードしておく必要があります。

#include <iomanip>

右詰め

std::cout << std::right << std::setw(4) <<  12 << std::endl; // "  12"
std::cout << std::right << std::setw(4) << -12 << std::endl; // " -12"

左詰め

std::cout << std::left << std::setw(4) <<  12 << std::endl; // "12  "
std::cout << std::left << std::setw(4) << -12 << std::endl; // "-12 "

ゼロ埋め

std::cout << std::setfill('0') << std::right << std::setw(4) << 12 << std::endl; // "0012"
std::cout << std::setfill('0') << std::left  << std::setw(4) << 12 << std::endl; // "1200"

std::cout << std::setfill(' '); // ゼロ埋め・解除(デフォルトに戻す)

解説

左寄せと右寄せはそれぞれstd::left, std::rightマニピュレータを用いて行います。文字幅はstd::setw()、詰めたい文字はstd::setfill()で指定します(空白やゼロ以外の文字も指定出来ます)。

いずれのマニピュレータもiomanipヘッダーを読み込むことで利用可能になります。

以下は文字揃え関連のフォーマットでよく使われるマニピュレータです。

#include <iomanip>
std::left;          // 左揃えで出力
std::right;         // 右揃えで出力
std::setw(int);     // 文字幅を指定
std::setfill(char); // 詰め文字
std::internal;      // 符号左揃え、数字右揃え
std::showpos;       // 正の符号も出力

注意点

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"

/* 解除 */
std::cout << std::right;
std::cout << std::noshowpos;
std::cout << std::setfill(' ');
std::cout << std::setw(4) << 12; // "  12"

広告

関連するオススメの記事