PerlならサンプルコードPerl入門

2008-10-01

sprintf関数 - 文字列の書式指定

  1. Perl
  2. 関数
  3. here

 書式指定した文字列を作成するにはsprintf関数を使用します。数値の左側を0で埋めて出力したい場合や、浮動小数点の少数の桁数を指定したい場合などに、sprintf関数を使うと便利です。

my $str = sprintf("%08d", $num1);
my $str = sprintf("%.2f", $num2);
my $str = sprintf("aiueo%08daiueo%.2f", $num1, $num2);

 数値や文字列をある規則にしたがって出力したい場合があります。たとえば、足りない部分を空白で埋めた固定長の文字列を作成したい場合 "18     " のようにわざわざ空白を作っておくのは面倒です。

 sprintf関数で書式指定を行えば、 "18" を "18     " のように変換できます。

 またたとえば足りない部分を0で埋めた数値を出力することもできます。 18 を '00000018' にすることができます。

 小数点をある桁で丸めて出力することもできます。 12.3456 を 小数点第一位で丸めて '12.3' にできます。

書式指定の記述方法

my $str = sprintf("%08d", $num1);
my $str = sprintf("%.2f", $num2);
my $str = sprintf("aiueo%08daiueo%.2f", $num1, $num2);

 書式指定は%で始まります。最後は d や f などの決められた英数字で終わります。dは第2引数を整数として解釈するという意味で、fは浮動小数点として解釈するという意味です。

 % と 英文字 の間にはどのような書式で文字列を作成するかということを指定します。"%08d"は「$num1を整数として解釈して8文字に満たない場合は0で埋める」と読みます。"%.2f"は「$num2を浮動小数点として解釈して小数点以下2桁で丸める」と読みます。

sprintf関数の書式指定子一覧

 sprintf関数には書式を設定するさまざまな指定子が存在します。一覧を作成しました。

%c

 %cはASCII文字コードに対応する文字に変換するフォーマット指定子です。

%s

 %sは引数を文字列として解釈するフォーマット指定子です。'002'のように先頭に0がついている場合は、そのまま文字列として'002'になります。

%d

 %dは引数を符号付整数として解釈します。たとえば'0003'を渡した場合は、数値としてみれば 3であるので 3 に変換されます。

%u

 %uは引数を正の整数として解釈します。

%o

 %oは引数を正の整数として解釈して8進文字列に変換します。

%x %X

 %xは引数を正の整数として解釈して16進文字列に変換します。%xの場合は表記が小文字に、%Xの場合は表記が大文字になります。

%b

 %bは引数を正の整数として解釈して2進文字列に変換します。

%f

 %fは引数を浮動小数点として解釈します。

%e %E

 %eは%fと同じですが、指数表記にフォーマットしてくれます。%eの場合は表記が小文字に、%Eの場合は表記が大文字になります。

%g %G

 %gは引数を浮動小数点として解釈して %e か %f にフォーマットします。小数点以下が短い場合などは、%fのフォーマットに、長い場合は%eのフォーマットになったりします。

 また、%gは%f,%e と異なり末尾の余分な0はつきません。

%p

 %pで引数で与えられた変数のメモリ上のアドレスを16進表記で取得できます。

サンプル

 sprintf関数のサンプルです。

use strict;
use warnings;

my $num1 = 3;

# 8桁で足りない部分は0で埋める
my $formated1 = sprintf("%08d", $num1); 
print $formated1 . "\n\n";

# 小数点以下2桁に丸める
my $num2 = 3.1415;
my $formated2 = sprintf("%.2f", $num2);
print $formated2 . "\n\n";

# 複数の引数を指定する
my $formated3 = sprintf("aiueo%08daiueo%.2f", $num1, $num2);
print $formated3 . "\n";

 さまざまな書式指定のサンプルです。

use strict;
use warnings;

print "(1)書式指定子一覧\n";
my @formated;

# 65 はASCIIコードで 'A'
$formated[1]  = sprintf("1: %c", 65);

# 文字列として解釈
$formated[2]  = sprintf("2: %s", '00002');

# 符号付整数として解釈 
$formated[3]  = sprintf("3: %d", '-00002');

# 符号なし整数として解釈
$formated[4]  = sprintf("4: %u", '00002');

# 10進数を8進数に変換
$formated[5]  = sprintf("5: %o", 8);

# 10進数を16進数に変換(小文字表記)
$formated[6]  = sprintf("6: %x", 255);

# 10進数を16進数に変換(大文字表記)
$formated[7]  = sprintf("7: %X", 255);

# 10進数を2進数に変換 
$formated[8]  = sprintf("8: %b", 4);

# 浮動少数点として解釈
$formated[9]  = sprintf("9: %f", 0.00004560);

# 浮動小数点として解釈
# (指数表記小文字)
$formated[10] = sprintf("10: %e",0.00004560);

# 浮動小数点として解釈
# (指数表記大文字)
$formated[11] = sprintf("11: %E",0.00004560);

# 浮動小数点として解釈
# (末尾0は削除される)
$formated[12] = sprintf("12: %g", 0.00004560);

# 浮動小数点として解釈
# (末尾の0は削除される。大文字)
$formated[13] = sprintf("13: %G", 0.00004560);

# $num のメモリ上のアドレス
my $num = 3;                                              
$formated[14] = sprintf("14: %p", $num); 

for my $i (1 .. 14) {
  print $formated[$i] . "\n"; 
}

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証