web-dev-qa-db-ja.com

数値の最大printfフィールド幅を指定しますか(必要に応じて切り捨てます)?

printfフィールド幅指定子を使用して文字列を切り捨てることができます。

printf("%.5s", "abcdefgh");

> abcde

残念ながら、数値に対しては機能しません(dxに置き換えることは同じです):

printf("%2d",   1234);  // for 34
printf("%.2d",  1234);  // for 34
printf("%-2d",  1234);  // for 12
printf("%-.2d", 1234);  // for 12

> 1234

数値を切り捨てることを意味する場合でも、印刷する桁数を指定する簡単で簡単な方法はありますか?

特にMSDN それは起こらないと言っています これは不必要に制限しているようです。 (はい、文字列などを作成することで実行できますが、 「printfトリック」 または巧妙な応急修理を期待しています。)

17
Synetech

私の最高のアイデアの多くと同様に、答えはベッドに横になって眠りにつくのを待っている間に私に届きました(その時点で考える以外にやることはほとんどありません)。

モジュラスを使用してください!

printf("%2d\n", 1234%10);   // for 4
printf("%2d\n", 1234%100);  // for 34

printf("%2x\n", 1234%16);   // for 2
printf("%2x\n", 1234%256);  // for d2

左から切り捨てることができないため、理想的ではありません(例:12 の代わりに 34)ですが、主なユースケースで機能します。例えば:

// print a decimal ruler
for (int i=0; i<36; i++)
  printf("%d", i%10);
26
Synetech

右から切り捨てたい場合は、数値を文字列に変換してから、文字列フィールド幅指定子を使用できます。

"%.3s".format(1234567.toString)
5
Johannes Luong

Bashコマンドラインからの例:

localhost ~$ printf "%.3s\n" $(printf "%03d"  1234)
123
localhost ~$ 
3
adrigiga

左からいかがですか?唯一の違いは、単純な除算を使用することです。

printf("%2d", 1234/100); // you get 12
0
troy

Snprintfを使用して右から切り捨てることができます

char buf[10];
static const int WIDTH_INCL_NULL = 3;

snprintf(buf, WIDTH_INCL_NULL, "%d", 1234); // buf will contain 12
0
KarlR