1. ホーム
  2. c++

C++の出力演算子で先頭のゼロを表示しますか?

2023-09-24 01:52:41

質問

C++で出力をフォーマットするにはどうしたらよいでしょうか。言い換えれば、C++で printf のようなものです。

printf("%05d", zipCode);

を使えばいいのは分かっているのですが printf を使うこともできますが、私は出力演算子の << .

を使うだけでしょうか?

std::cout << "ZIP code: " << sprintf("%05d", zipCode) << std::endl;

どのように解決するのですか?

これは、少なくとも非負の数については、トリックを行います。 (a) のような、郵便番号のような (b) のようなものです。

#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;

パディングを制御するIOマニピュレータとして代表的なものは

  • std::setw(width) は、フィールドの幅を設定します。
  • std::setfill(fillchar) は塗りつぶし文字を設定します。
  • std::setiosflags(align) は整列を設定します。整列はios::leftまたはios::rightです。

そして、あなたの好みに合わせて << を使いたいのであれば、私は強く fmt ライブラリに目を向けることを強くお勧めします ( https://github.com/fmtlib/fmt ). これは私たちのツールキットに追加された、フォーマットするための素晴らしいもので、大量の長さのストリームパイプラインよりもずっと素晴らしく、次のようなことが可能になります。

cout << fmt::format("{:05d}", zipCode);

そして、これは現在 LEWG によって C++20 に向けてターゲットにされており、その時点で言語の基本部分となることを期待しています (あるいは、完全に忍び込まない場合はほぼ確実に後でそうなります)。



(a) もし、あなたが する が負の数を扱う必要がある場合は std::internal を以下のように使用します。

cout << internal << setw(5) << setfill('0') << zipCode << endl;

これは、塗りつぶし文字 の間に という記号と大きさの間に配置します。


(b) これ ("all ZIP codes are non-negative") は私の側での仮定ですが、それなりに安全な仮定であることは保証します :-)