郵便番号の場合は01001のように、先頭の0を印刷するのに適した方法を見つけようとしています。番号は1001として格納されますが、それを行うための良い方法は何ですか?
どちらのcaseステートメント/ ifを使用してその数字が何桁であるかを調べてから、印刷用に余分な0を持つchar配列に変換することを考えました。私を避けているprintfフォーマットの構文。
printf("%05d", zipCode);
正しい解決策は、郵便番号をSTRINGとしてデータベースに格納することです。数字のように見えるかもしれないという事実にもかかわらず、そうではありません。それは各部分が意味を持つコードです。
数字はあなたが算術をするものです。郵便番号はそれではありません。
最小フィールド幅の前にゼロを配置します。
printf("%05d",zipcode);
郵便番号は非常にローカライズされた分野であり、多くの国、例えば英国、カナダでは郵便番号に文字があります。したがって、この例では、いつでも出荷したり、他の国からユーザー/顧客/クライアントなどを入手する場合は、それを保管するためにストリング/ varcharフィールドを使用する必要があります。
しかし一般的な場合には、推奨される答え(printf("%05d", 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はさまざまなフォーマットオプションを可能にします。
例:
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
関数とマクロは、printfが読みやすくなるように設計されています。
郵便番号を文字配列zipcode []に格納する必要がある場合は、これを使用できます。
snprintf( zipcode, 6, "%05.5d", atoi(zipcode));