double型やfloat型などの浮動小数点数型(実数型)の小数部の桁数を揃えるためのフォーマット方法を紹介します
以下のように%.桁数f
という形式で修飾します。%.2f
と書けば小数第2位までが表示されます。
printf("%f" , 3.14); // 3.140000(デフォルト)
printf("%.2f", 3.14); // 3.14 (下二桁)
printf("%.0f", 3.14); // 3 (小数点以下切り捨て)
printf("%.f" , 3.14); // 3 (小数点以下切り捨て)
printf("%5.2f", 3.14); // " 3.14"(右詰め)
printf("%.2f", 0.0 / 0); // "nan" (NaN)
printf("%.2f", 1.0 / 0); // "inf" (Infinity)
C言語もC++も、printf関数やfprintf関数、sprintf/snprintf関数を用いる場合には、共通の方法で桁数指定が可能です。C++のstd::cout
等の出力ストリームで小数点の桁数を指定したい場合には、以下の記事が参考になります。
【C++】小数点の桁数を指定する方法と注意点【iostream】
整数部と小数部の扱いについて
ゼロ埋め処理や右詰め/左詰め処理と組み合わせる場合に注意してください。
特に%4.2f
の4は整数部の桁数と間違われやすいのですが、実際はフィールド幅となります。つまり整数部と小数部の桁数の合計と小数点や符号を含めた全体の桁数ということになります。
// 右詰め
printf("%4.2f", 3.14); // "3.14"(" 3.14"ではない)
printf("%7.2f", 3.14); // " 3.14"(期待値)
// 左詰め
printf("%-4.2f", 3.14); // "3.14"
printf("%-7.2f", 3.14); // "3.14 "
// ゼロ埋め
printf("%04.2f", 3.14); // "3.14"
printf("%07.2f", 3.14); // "0003.14"
// マイナス
printf("%6.2f", -3.14); // " -3.14"
要するにここで指定された4
や7
は文字列全体の桁数という事になります。printfの用途的には当たり前の挙動なのですが、勘違いされやすいため注意してください。
なお、右詰め・右詰め・ゼロ埋めに関する詳しい説明は以下のページを参考にしてください。
参考: 右詰め・右詰め・ゼロ埋め処理
豆知識
ピリオドによる幅指定は文字列に対しても使えます。
printf("%.2s", "abcd"); // "ab"
printf("%4.2s", "abcd"); // " ab"
この場合は最大幅という扱いになり、超過した文字列は切り捨てられます。
より詳しい説明や応用例については、以下の記事が参考になります。
参考: 文字列の一部を表示する|部分文字列の出力【printf substringイディオム】