フォーマット指定子の精度/最大幅を指定する

フォーマット指定子のオプションの 1 つである精度/最大幅を指定する方法です。精度および最大幅は数値に対して設定した場合は精度となり、文字列に対して設定した場合は最大幅となります。ここでは Perl でフォーマット指定子のオプションである精度/最大幅の使い方について解説します。

(Last modified: )

精度/最大幅を指定する

フォーマット指定子のオプションの 1 つである精度/最大幅を指定する方法です。精度/最大幅を指定する場合はフォーマット指定子の次の位置に記述します。

%[フラグ][最小幅][.精度/最大幅]型指定子

このオプション項目は、数値に対して設定した場合は精度となり、文字列に対して設定した場合は最大幅となります。

浮動小数点数に対して設定する

浮動小数点数に対して精度を指定した場合は、小数点以下の桁数となります。

まず固定小数点形式の浮動小数点に対して試してみます。

printf("%f\n", 0.012);
printf("%.0f\n", 0.012);
printf("%.1f\n", 0.012);
printf("%.2f\n", 0.012);
printf("%.3f\n", 0.012);
printf("%.4f\n", 0.012);

上記では型変換子として %f を指定し、さらに精度を 0 から 4 までの数値で順に指定しています。結果は次のようになります。

0.012000
0
0.0
0.01
0.012

指定した精度によって結果の小数点以下の桁数が変化することが確認できます。では今度は指数形式の浮動小数点で試してみます。

printf("%e\n", 0.012);
printf("%.0e\n", 0.012);
printf("%.1e\n", 0.012);
printf("%.2e\n", 0.012);
printf("%.3e\n", 0.012);

上記では型変換子として %e を指定し、さらに精度を 0 から 4 までの数値で順に指定しています。結果は次のようになります。

1.200000e-002
1e-002
1.2e-002
1.20e-002
1.200e-002

指定した精度によって結果の小数点以下の桁数が変化することが確認できます。

整数に対して設定する

整数に対して精度を指定した場合は、数値部分の桁数となります。数値部分が精度に指定した桁よりも少ない場合は 0 詰めとなります。数値部分が精度よりも多い場合は何も変更は加えられません。

次の例は精度だけを指定した場合です。

printf("[%.2d]\n", 123);
printf("[%.4d]\n", 123);
printf("[%.6d]\n", 123);

上記では型変換子として %d を指定し、さらに精度を変化させて指定しています。結果は次のようになります。

[123]
[0123]
[000123]

数値部分が精度で指定した値よりも少ない場合は変化ありませんが、精度で指定した値の方が大きい場合は 0 詰めで表示されます。

次の例は最小幅と精度をあわせて指定した場合です。

printf("[%8.2d]\n", 123);
printf("[%8.4d]\n", 123);
printf("[%8.6d]\n", 123);

結果は次のようになります。

[     123]
[    0123]
[  000123]

次は 16 進数の数値に対して設定してみます。

printf("[%.6x]\n", 123);
printf("[%#.6x]\n", 123);

上記では型変換子として %x を指定し、さらに精度を設定しています。結果は次のようになります。

[00007b]
[0x00007b]

1 つはフラグとして # を合わせて指定しています。結果として数値の先頭に 0x が付きますが、精度として指定した桁数はあくまで数値部分に対して有効となります。

文字列に対して設定する

文字列に対しては精度ではなく最大幅として機能します。設定した最大幅よりも文字列が長い場合は最大幅で切り捨てられます。

次の例を見てください。

printf("[%s]\n", "Javascript");
printf("[%.5s]\n", "Javascript");
printf("[%.15s]\n", "Javascript");

上記では型変換子として %s を指定し、さらに精度を設定しています。結果は次のようになります。

[Javascript]
[Javas]
[Javascript]

最大幅が文字数よりも少ない場合は文字列が最大幅で切り捨てられます。最大幅が文字数よりも多い場合は何も変更は加えられません。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

printf("%f\n", 0.012);
printf("%.4f\n", 0.012);
printf("%e\n", 0.012);
printf("%.3e\n", 0.012);

printf("[%.4d]\n", 123);
printf("[%.6d]\n", 123);
printf("[%8.6d]\n", 123);

printf("[%.6x]\n", 123);
printf("[%#.6x]\n", 123);

printf("[%s]\n", "Javascript");
printf("[%.5s]\n", "Javascript");

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

精度/最大幅を指定する(1)

数値に対して精度、文字列に対して最大幅を設定しフォーマットされた文字列を取得しました。

精度/最大幅の桁数を値で指定する

フォーマット指定子のオプションの1つである精度/最大幅を指定する時に、直接数値を指定する代わりに * を記述すると、桁数を値として指定することができます。

例えば精度を 6 桁に設定する場合は次のように記述していました。

printf("[%.6d]\n", 123);

精度の部分を値で指定するには、精度を指定する位置に * を記述し、変換する値を指定する前に精度の桁数を指定します。

printf("[%.*d]\n", 6, 123);

この 2 つは同じ結果となり次のように表示されます。

[000123]

この書式を使用する場合には 1 つの書式指定文字列に対して桁数と変換する値の 2 つの値を指定することになります。

サンプルコード

それでは簡単なサンプルを作成します。

use strict;
use warnings;
use utf8;
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

printf("[%.6d]\n", 123);
printf("[%.*d]\n", 6, 123);

printf("[%s] [%.*s] \n", "Hello", 3, "Hello");

テキストエディタでプログラムを記述したあと sample.pl という名前で保存します。(文字コードは UTF-8 です)。コマンドプロンプトを起動し、プログラムを保存したディレクトリへ移動したあとで次のように実行します。

perl sample.pl

次のように実行結果が表示されます。

精度/最大幅の桁数を値で指定する(1)

精度や最大幅の桁数を引数の形で指定しました。

-- --

Perl でフォーマット指定子のオプションである精度/最大幅の使い方について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。