【C言語】右詰め 右詰め ゼロ埋めを行う方法と豆知識【printf】


C言語のフォーマット関数(printf, sprintf)でゼロ埋め(zero padding)や空白による右詰め右詰めを実現する方法です。

目次

豆知識

スポンサーリンク

右詰め

printf("%4d", 12);   // "  12"
printf("%9f", 3.14); // " 3.140000"
// !!!: 小数点とピリオドを含めて9桁

左詰め

printf("%-4d", 12);   // "12  "
printf("%-9f", 3.14); // "3.140000 "

ゼロ埋め

printf("%04d", 12);    // 0012
printf("%08d", 12);    // 00000012
printf("%09f", 3.14);  // 03.140000

表示幅の動的指定

最小表示幅の数を動的に指定したい場合は*を用いて対応する文字幅を引数で指定します。

printf("%*s", 4, "12"); // "  12"
printf("%0*d", 4, 12);  // "0012"

注意点

「右詰め・右詰め・ゼロ埋め」いずれの方法も、桁数として符号や小数点を含める点に注意してください。

printf("%4d", -12);    // " -12"
printf("%4.2f", 3.14); // "3.14"

float/double型等の実数型でフォーマットを行う際は以下のページも参考にしてみてください。

小数部の桁数を揃える方法

『ゼロ埋め・右詰め・左詰め』の業界豆知識♪

ゼロ埋めという表現はゼロパティングやゼロサプレスとも呼ばれることもあります。右詰め(right-padding, right-justify)と左詰め(left-padding, left-justify)はrpadやlpadと書かれることがあり、口頭ではライトパディング(ライトパッド)やレフトパディング(レフトパッド)と呼ばれることもあります。なお日本のSEはSQL経験との関係からアールパッドやエルパッドと表現することが多いように思います。また、人によっては右詰めのことを右寄せ・左揃えと言う人もいたりするので覚えておくと良いでしょう。

文字列に対するゼロ埋め

文字列指定子%sの場合は未定義動作で警告が発生します。

// 未定義動作: Flag '0' results in undefined behavior with 's' conversion specifier
printf("%08s", "12"); // 00000012 (in /usr/bin/clang)
printf("%08s", "12"); // 0012 (with UTF-8)
マルチバイト文字列との兼ね合いで未定義動作になっているのかと考えたこともあるのですが、左詰め桁数指定の場合は警告が発生しないため、なにか別の理由があるのかもしれません。

この問題に対処するためには、一度数字に変換してからフォーマットを行うようにします。

printf("%08d", atoi("12")); // 00000012

ゼロ埋めと左詰めは同時に利用出来ない

ゼロ埋めと左詰めを一緒に行うことは出来ません。この場合は-の方が優先されるように定められています。

// 警告: Flag '0' is ignored when flag '-' is present
printf("%-04d", 12); // "12  " (not "1200")

ゼロ埋めと左詰めを実現する方法

特殊なケースなので自前で処理を行う必要があります。

C++であれば、比較的スマートトリッキーに実現できます。

printf("%d\n", std::stoi((std::to_string(12) + "0000").substr(0, 4))); // "1200"
printf("%d\n", std::stoi((std::to_string(12345) + "0000").substr(0, 4))); // "1234"

auto s = std::to_string(12345);
auto r = std::string("0000");
printf("%d\n", std::stoi((s + r).substr(0, std::max(s.size(), r.size())))); // "12345"

ゼロ埋め文字を右詰め/左詰めする方法

char num[5];
snprintf(num, 5, "%04d", 12);
printf("%8s", num); // "    0012"
printf("%-8s", num); // "0012    "

広告

関連するオススメの記事