Cで先頭の0を印刷しますか?


344

私は郵便番号の01001のように、先頭の0を印刷する良い方法を見つけようとしています。数は1001として格納されますが、それを行うための良い方法は何ですか?

私はどちらかのcaseステートメントを使用することを考えました/その場合、数字が何桁であるかを把握し、それを印刷用に追加の0を含むchar配列に変換しますが、これを行う方法はないと思いますが、わずらわしいprintf形式の構文。

回答:


567
printf("%05d", zipCode);

0あなたとパディングとされているかを示す5ショー整数の長さ。たとえば、"%02d"(日付に便利)を使用する場合、これは1の列の数値にゼロを埋め込むだけです(つまり、の06代わりに6)。例2では、"%03d"1の列の1つの数値に対して2つのゼロを埋め、10の列の数値に対して1つのゼロを埋めます。すなわち。(数値7は埋め込み007、数値17は埋め込み017)。


237
郵便番号を数字として保存しないでください。一部の国では郵便番号に文字が含まれています。

1
あなたの場合、これで十分でしょう。未知の長さの整数に先行ゼロをどのように持つことができますか?
ドミニクモトゥカ2018年

最終的に埋め込まれた文字列の最大長を知る必要があります。または、常に5つの先行ゼロが必要な場合は、 "00000" + integer.to_sを使用します。etc
ランビア

160

正しい解決策は、郵便番号をデータベースにSTRINGとして保存することです。数字のように見えるかもしれませんが、そうではありません。これは、各部分に意味があるコードです。

数はあなたが算数をすることです。郵便番号はそうではありません。


32
Y A。あなたの観察は完全に正しいです。それが私がすることです。しかし、質問をする人はおそらく、プロダクションコードではなく宿題を処理しようとしています。答えは質問をする人に合わせて調整する必要があります。
EvilTeach 2008

15
慣れ親しんでいない言語で、先頭と末尾の文字をどのように処理できるかを確認するために探していたのを説明するために、より正確に言い換えたと思います。今後は任意の例に注意していきます!
zxcv 2008

3
英国などの他の国では、郵便番号に文字が含まれています
jjxtra


16

郵便番号は高度にローカライズされたフィールドであり、多くの国では郵便番号に文字が含まれています(例:英国、カナダ)。したがって、この例では、他の国からユーザー/顧客/クライアント/その他を出荷または取得する場合は、文字列/ varcharフィールドを使用して格納する必要があります。

ただし、一般的なケースでは、推奨される回答(printf("%05d", number);)を使用する必要があります。


16

* NIXマシンを使用している場合:

man 3 printf

次のようなマニュアルページが表示されます。

0値にはゼロを埋め込む必要があります。d、i、o、u、x、X、a、A、e、E、f、F、g、およびG変換の場合、変換された値の左側には、ブランクではなくゼロが埋め込まれます。0フラグと-フラグの両方が表示される場合、0フラグは無視されます。数値変換で精度が指定されている場合(d、i、o、u、x、およびX)、0フラグは無視されます。その他の変換の場合、動作は未定義です。

質問はC向けですが、このページは役立つかもしれません。


1
なぜ3つの数字が必要なのですか?
eri0o 2018

4
@Elric manコマンドに数値引数を指定すると、その特定のセクションに絞り込まれます。これがないと、printfC関数の代わりにシェルコマンドのマニュアルページが表示されます。
ポールトンブリン2018


6

printfでは、さまざまなフォーマットオプションを使用できます。

例:

printf("leading zeros %05d", 123);

3

郵便番号を数字ではなく文字列として保存することで、トラブルを大幅に軽減できます(長期)。


char配列をゼロ埋めする方法を誰かが説明するだけなら。atoi()を使用してchar配列をinitに変換してから%05dを使用するソリューションもあります。これが唯一の解決策ではないことを願っています。
Niko

0

より柔軟性があります..これは、幅が固定された右揃えの行とスペースパディングの行を印刷する例です。

//---- Header
std::string getFmt ( int wid, long val )
{  
  char buf[64];
  sprintf ( buf, "% *ld", wid, val );
  return buf;
}
#define FMT (getFmt(8,x).c_str())

//---- Put to use
printf ( "      COUNT     USED     FREE\n" );
printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) );
printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) );
printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) );

//-------- Output
      COUNT     USED     FREE
A:      354   148523     3283
B: 54138259 12392759   200391
C:    91239     3281    61423

関数とマクロは、printfsが読みやすくなるように設計されています。


4
マクロの意図は100%わかりませんが、変数(コードが実行するもの)ではなく、#define FMT(x) (getFmt(8,x).c_str())xパラメータに注意!)のように関数を定義するつもりのようです。
Ponkadoodle 2014

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.