質問
郵便番号の 01001 など、先頭の 0 を印刷する良い方法を見つけようとしています。番号は 1001 として保存されますが、これを行う良い方法は何でしょうか?
case ステートメント/if then のいずれかを使用して数値の桁数を把握し、それを印刷用に追加の 0 を含む char 配列に変換することを考えましたが、これを行う方法があるかもしれないと考えずにはいられません。 printf 形式の構文がわかりません。
解決
printf("%05d", zipCode);
他のヒント
正しい解決策は、データベースに郵便番号を文字列として保存することです。それは数字のように見えるかもしれないという事実にもかかわらず、そうではありません。それは、各部分に意味があるコードです。
数値は、算術演算を行うものです。郵便番号はそうではありません。
最小フィールド幅の前にゼロを置きます:
printf("%05d",zipcode);
Zipcodeは高度にローカライズされたフィールドで、多くの国では郵便番号に文字が含まれています(英国、カナダなど)。したがって、この例では、他の国からuser / customers / clients / etcを出荷または取得する場合は、文字列/ varcharフィールドを使用して保存する必要があります。
ただし、一般的な場合は、推奨される回答( printf("%05d&quot ;, number);
)を使用する必要があります。
* 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向けですが、このページは役に立つかもしれません。
sprintf(mystring, "%05d", myInt);
ここでは、" 05" 「先頭にゼロを付けて5桁を使用する」と言います。
printfはさまざまなフォーマットオプションを許可します。
ex:
printf("leading zeros %05d", 123);
郵便番号を数字ではなく文字列として保存すると、トラブルの山(長期)を節約できます。
より柔軟な.. 以下は、固定幅で右揃えの数字の行を印刷し、スペースを埋める例です。
//---- 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が読みやすいように設計されています。
郵便番号を文字配列 zipcode[] に保存する必要がある場合は、これを使用できます。
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));