printf
フィールド幅指定子を使用して文字列を切り捨てることができます。
printf("%.5s", "abcdefgh");
> abcde
残念ながら、数値に対しては機能しません(d
をx
に置き換えることは同じです):
printf("%2d", 1234); // for 34
printf("%.2d", 1234); // for 34
printf("%-2d", 1234); // for 12
printf("%-.2d", 1234); // for 12
> 1234
数値を切り捨てることを意味する場合でも、印刷する桁数を指定する簡単で簡単な方法はありますか?
特にMSDN それは起こらないと言っています これは不必要に制限しているようです。 (はい、文字列などを作成することで実行できますが、 「printfトリック」 または巧妙な応急修理を期待しています。)
私の最高のアイデアの多くと同様に、答えはベッドに横になって眠りにつくのを待っている間に私に届きました(その時点で考える以外にやることはほとんどありません)。
モジュラスを使用してください!
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);
右から切り捨てたい場合は、数値を文字列に変換してから、文字列フィールド幅指定子を使用できます。
"%.3s".format(1234567.toString)
Bashコマンドラインからの例:
localhost ~$ printf "%.3s\n" $(printf "%03d" 1234)
123
localhost ~$
左からいかがですか?唯一の違いは、単純な除算を使用することです。
printf("%2d", 1234/100); // you get 12
Snprintfを使用して右から切り捨てることができます
char buf[10];
static const int WIDTH_INCL_NULL = 3;
snprintf(buf, WIDTH_INCL_NULL, "%d", 1234); // buf will contain 12