Hatena::ブログ(Diary)

Perl勉強日記 このページをアンテナに追加 RSSフィード

2012-01-04

printf関数とsprintf関数のフォーマット指定子のオプションと型指定子

printf関数とsprintf関数の書式指定文字列でリストの値を変換する書式を指定するための、フォーマット指定子のオプションと型指定子についてのまとめ。
書式指定文字列については前記事参照のこと。
参考にさせて頂いたサイト:PerlPlus

型指定子


型指定子意味
%d10進数
%u符号無し10進数
%o符号無し8進数
%x符号無し16進数
%X符号無し16進数(大文字表記)
%e指数形式の浮動小数点
%E%eと同じ(大文字表記)
%f固定小数点形式の浮動小数点
%g%eまたは%fと同じ
%G%eまたは%fと同じ(大文字表記)
%b符号無し2進数
%c指定した文字コードに対応した文字
%s文字列
%p値のポインタ
%n文字数を指定した変数に格納
%%%の文字そのもの(\と同様の使い方)

サンプルプログラムを書いてみた。

#! /usr/bin/perl

printf ("[%d]	10進数\n", 72.001);
printf ("[%u]	符号無し10進数\n", 72.001);
printf ("[%o]	符号無し8進数\n", 72.001);
printf ("[%x]	16進数\n", 72.001);
printf ("[%X]	符号無し16進数の大文字表記\n", 72.001);
printf ("[%e]	指数形式の浮動小数点\n", 72.001);
printf ("[%E]	指数形式の浮動小数点の大文字表記\n", 72.001);
printf ("[%f]	固定小数点形式の浮動小数点\n", 72.001);
printf ("[%g]	指数形式または固定小数点形式の浮動小数点\n", 72.001);
printf ("[%G]	指数形式または固定小数点形式の浮動小数点の大文字表記\n", 72.001);
printf ("[%b]	符号無し2進数\n", 72.001);
printf ("[%c]	文字コード72に対応した文字\n", 72);
printf ("[%s]	72を漢字で表示\n", "七十二");
printf ("[%p]	72のポインタ\n", 72);
printf ("Hello World%n", $mojisu);print " → Hello Worldの文字数は$mojisuです\n";
printf ("%%の記号そのものを表示\n");

以下実行結果。

$ ./printf_katashiteishi.pl 
[72]	10進数
[72]	符号無し10進数
[110]	符号無し8進数
[48]	16進数
[48]	符号無し16進数の大文字表記
[7.200100e+01]	指数形式の浮動小数点
[7.200100E+01]	指数形式の浮動小数点の大文字表記
[72.001000]	固定小数点形式の浮動小数点
[72.001]	指数形式または固定小数点形式の浮動小数点
[72.001]	指数形式または固定小数点形式の浮動小数点の大文字表記
[1001000]	符号無し2進数
[H]	文字コード72に対応した文字
[七十二]	72を漢字で表示
[10082b010]	72のポインタ
Hello World → Hello Worldの文字数は11です
%の記号そのものを表示

フラグ


フラグ意味
space数値が正の場合前にスペースをつける
+数値が正だった場合に前に+をつける
-左詰め(デフォルトは右詰め)
0右詰めの場合に0詰め
#数値が0以外の場合は、8進数の場合は0、16進数の場合は0xまたは0X、2進数の場合は0bをつける

最小幅

書式変換後、結果として表示される文字列の最小の幅を設定するオプション。結果が最小幅よりも小さい場合は空白などで埋められる。結果が最小幅より大きい場合は、設定した最小幅に関わらず必要な幅で表示される。

以下、フラグと最小幅のサンプルプログラム。

#! /usr/bin/perl

printf ("[%4d]	最小幅4\n", 72);
printf ("[%+4d]	最小幅4で整数に+つける\n", 72);
printf ("[%-4d]	最小幅4で左詰め\n", 72);
printf ("[%- 4d]	最小幅4で左詰めスペース入り\n", 72);
printf ("[%04d]	最小幅4で右詰めゼロ詰め\n", 72);
printf ("[%#4o]	最小幅4で8進数の頭に0をつける\n", 72);
printf ("[%#4x]	最小幅4で16進数の頭に0xまたは0Xをつける\n", 72);
printf ("[%#4b]	最小幅4で2進数の頭に0bをつける\n", 72);

実行結果は下記の通り。

$ ./printf_flag.pl 
[  72]	最小幅4
[ +72]	最小幅4で整数に+つける
[72  ]	最小幅4で左詰め
[ 72 ]	最小幅4で左詰めスペース入り
[0072]	最小幅4で右詰めゼロ詰め
[0110]	最小幅4で8進数の頭に0をつける
[0x48]	最小幅4で16進数の頭に0xまたは0Xをつける
[0b1001000]	最小幅4で2進数の頭に0bをつける

.精度/最大幅

このオプションは、数値に対して設定すれば精度、文字列に対して設定すれば最大幅となる。
浮動小数点に設定した場合は、小数点以下の桁数に、整数に設定した場合は桁数になり指定した精度より少ない桁数の場合は0詰めされる。
文字列に対して設定した場合は、最大幅となる。指定した文字列が最大幅より大きい場合は、指定した最大幅で切り捨てられる。最大幅よりも文字数が少ない場合はそのまま表示される。

以下はサンプルプログラム。型指定子のサンプルプログラムと見比べるとわかりやすい。

#! /usr/bin/perl

printf ("[%.4d]	10進数\n", 72.001);
printf ("[%.4u]	符号無し10進数\n", 72.001);
printf ("[%.4o]	符号無し8進数\n", 72.001);
printf ("[%.4x]	16進数\n", 72.001);
printf ("[%.4X]	符号無し16進数の大文字表記\n", 72.001);
printf ("[%.4e]	指数形式の浮動小数点\n", 72.001);
printf ("[%.4E]	指数形式の浮動小数点の大文字表記\n", 72.001);
printf ("[%.4f]	固定小数点形式の浮動小数点\n", 72.001);
printf ("[%.4g]	指数形式または固定小数点形式の浮動小数点\n", 72.001);
printf ("[%.4G]	指数形式または固定小数点形式の浮動小数点の大文字表記\n", 72.001);
printf ("[%.4b]	符号無し2進数\n", 72.001);
printf ("[%.4c]	文字コード72に対応した文字\n", 72);
printf ("[%.4s]	72を漢字で表示\n", "七十二");
printf ("[%.4s]	72を英語で表示\n", "Seventy-Two");
printf ("[%.4p]	72のポインタ\n", 72);
printf ("Hello World%n", $mojisu);print " → Hello Worldの文字数は$mojisuです\n";
printf ("%%の記号そのものを表示\n");

実行結果は以下の通り。

$ ./printf_seidosaidai.pl 
[0072]	10進数
[0072]	符号無し10進数
[0110]	符号無し8進数
[0048]	16進数
[0048]	符号無し16進数の大文字表記
[7.2001e+01]	指数形式の浮動小数点
[7.2001E+01]	指数形式の浮動小数点の大文字表記
[72.0010]	固定小数点形式の浮動小数点
[72]	指数形式または固定小数点形式の浮動小数点
[72]	指数形式または固定小数点形式の浮動小数点の大文字表記
[1001000]	符号無し2進数
[H]	文字コード72に対応した文字
[七?]	72を漢字で表示
[Seve]	72を英語で表示
[10082b040]	72のポインタ
Hello World → Hello Worldの文字数は11です
%の記号そのものを表示

面白いのは、漢字を表示させたとき。最大幅が6あれば2文字表示されるのだけど、4にすると1文字と?が表示された。

精度、最大幅は以下のように指定する事も出来る。その場合、1つの型指定子に対し、最大幅とリストの値の、2つの値を指定する。

printf ("[%*d]10進数最大幅4", 4, 72);

これは以下と同じ意味。

printf ("[%4d]10進数最大幅4", 72);

以下は実行結果。

[  72]	10進数最大幅4

ふむふむ。

chychy 2014/05/28 10:03 きれいにまとまってて、使いやすいプチ辞書ですね。

kaz-cozkaz-coz 2014/05/28 18:20 chyさん、コメントありがとうございます。
そう言って頂けるととても嬉しいです。

型指定子とフラグの表はほとんどPerlPlusさんの受け売りですが、全然プログラミングの経験がない初心者なので、色々入門サイトを見てもピンとこない部分があり、自分で苦労したので忘れないように覚え書きを残しています。
いくらかでも同じように入門サイトを見てもピンとこない人のお役に立てたらと思ってここで公開しています。

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


画像認証

トラックバック - http://d.hatena.ne.jp/kaz-coz/20120104/1325692066