一般に左寄せにすることが多い文字列を右寄せにしたり、数字に正負記号をつけたり、数字の前にゼロをつけるなど文字列のフォーマットを変えたりしたいことがあります。このような場合には、sprintf関数を使います。sprintf関数は文字列のフォーマットを変換するだけですが、変換して実際に出力までしたいときにはprintf関数を使います。
sprintf関数には2つの引数が必要です。第1の引数には「書式指定文字列」、第2の引数にはフォーマットするデータ(定数でも変数でも可)を指定します。このうち、「書式指定文字列」は%[フラグ][幅][.精度]フォーマット指定子の形式で指定します([]の中は省略可能な項目を表します)。
具体的には以下のようになります。
sprintfのフラグ
フラグ | 内 容 |
- | データを左詰めにします(指定しないと右詰めになることに注意してください。特に文字列はこれを指定しないと右詰めになる点に注意が必要です)。 |
+ | 正の数値に「+」符号をつけます(指定しないと何もつきません。負の数値は指定の有無にかかわらず、「-」符号がつきます)。 |
0 | 数値の前に余った桁数があれば、「0」を埋めます。 |
# | 2進数の時は「0b」、8進数の時は「0」、16進数の時は「0x」を数値の前につけます。 |
sprintfの幅と精度
幅または幅.精度のように指定しますが、文字列か数値かなどによって内容が異なります。
幅/精度 | 内 容 |
幅 | 文字列の場合、文字列の桁数よりも大きな値を指定したときは、指定した桁数を取ります。文字列の桁数よりも小さな値を指定したときは、指定した値を無視して、文字列の桁数を取ります(ただし、精度の値のほうが文字列の桁数より小さいときは精度の値の桁数を取ります)。 数値の場合は、小数点も含めた桁数を指定します。 |
精度 | 文字列の場合、文字列の最大桁数を指定します。したがって、「幅」に何を指定しても「幅.」のように「精度」に何も指定しないと何も表示されなくなります。また、「%10.10s」のように幅と精度を同じにすると、正確にその文字分(ここでは10文字)の幅を取り、その文字分が表示されるようになります。 数値の場合は、整数のフォーマット指示子 ("d", "i", "b", "o", "x", "X", "u") に対しては、指定しても無視されます。浮動小数点数のフォーマット指示子 ("f")に対しては、小数点以下の桁数を表します。浮動小数点数のフォーマット指示子 ("e","E","g","G")に対しては、有効桁数を表します。 |
sprintfのフォーマット指定子
指定子 | 内 容 |
%c | データに0〜255までの数値を指定すると対応する文字コード1文字を表示します。たとえば「57」を指定すると「9」、「65」を指定すると「A」、「97」を指定すると「a」を表示します。 |
%s | 文字列の場合に指定します。 |
%d | 10進数の整数値を表示します(小数点以下は切り捨てます)。 |
%b | 2進数の整数値を表示します(小数点以下は切り捨てます)。 |
%o | 8進数の整数値を表示します(小数点以下は切り捨てます)。 |
%u | 符号なし10進数の整数値を表示します(小数点以下は切り捨てます)。 |
%x | 符号なし16進数の整数値を表示します(小数点以下は切り捨てます)。英字は小文字になります。 |
%X | 符号なし16進数の整数値を表示します(小数点以下は切り捨てます)。英字は大文字になります。 |
%e | 浮動小数点数(x.xxxxxxe+yyy)の形式で表示します(x.xxxxxxは小数のついた数字、e+yyyは10のyyy乗を表します)。英字("e")は小文字になります。 |
%E | 浮動小数点数(x.xxxxxxE+yyy)の形式で表示します(x.xxxxxxは小数のついた数字、E+yyyは10のyyy乗を表します)。英字("E")は大文字になります。 |
%f | 浮動小数点数を表示します。精度を指定しないと小数点以下6桁で、精度を指定すれば、指定した桁数で表示します。 |
%g | %eまたは%fのどちらか少ない桁数で表示できる形式で表示します。英字は小文字になります。 |
%G | %Eまたは%fのどちらか少ない桁数で表示できる形式で表示します。英字は大文字になります。 |
%ld | 倍精度の符号つき10進数の整数値を表示します(小数点以下は切り捨てます)。 |
%lu | 倍精度の符号なし10進数の整数値を表示します(小数点以下は切り捨てます)。 |
%lo | 倍精度の8進数の整数値を表示します(小数点以下は切り捨てます)。 |
%lx | 倍精度の16進数の整数値を表示します(小数点以下は切り捨てます)。 |
それでは、実際にどう使用するのか見ていきましょう。
# sprintf.pl # 内容 : sprintfのサンプルプログラム # Copyright (c) 2011 Mitsuo Minagawa, All rights reserved. # (minagawa@fb3.so-net.ne.jp) # 使用方法 : c:\>perl sprintf.pl # open(OUT1,">output.txt"); $a = "abcdefg"; $m = 109; print OUT1 "109の%c= ".sprintf("%c\n", $m); print OUT1 "aの値は= ".sprintf("%s\n", $a); print OUT1 "%10s = ".sprintf("%10s\n", $a); print OUT1 "%5s = ".sprintf("%5s\n", $a); print OUT1 "%5.s = ".sprintf("%5.s\n", $a); print OUT1 "%.2s = ".sprintf("%.2s\n", $a); print OUT1 "%-10s = ".sprintf("%-10s\n", $a); $a = 1234.5678; $b = 123456.789; $x = 1234567.89; $c = -1234.5678; $d = -123456.789; $y = -1234567.89; $xx = 1234567890.45; $yy = -1234567890.45; print OUT1 "\n"; print OUT1 "aの値は= ".sprintf("%s\n", $a); print OUT1 "%d = ".sprintf("%d\n", $a); print OUT1 "%+d = ".sprintf("%+d\n", $a); print OUT1 "%10d = ".sprintf("%10d\n", $a); print OUT1 "%10.2d = ".sprintf("%10.2d\n", $a); print OUT1 "%-d = ".sprintf("%-d\n", $a); print OUT1 "%-10d = ".sprintf("%-10d\n", $a); print OUT1 "%f = ".sprintf("%f\n", $a); print OUT1 "%b = ".sprintf("%b\n", $a); print OUT1 "%o = ".sprintf("%o\n", $a); print OUT1 "%x = ".sprintf("%x\n", $a); print OUT1 "%X = ".sprintf("%X\n", $a); print OUT1 "%e = ".sprintf("%e\n", $a); print OUT1 "%11e = ".sprintf("%11e\n", $a); print OUT1 "%.3e = ".sprintf("%.3e\n", $a); print OUT1 "%7.2e = ".sprintf("%7.2e\n", $a); print OUT1 "%07.2e = ".sprintf("%07.2e\n", $a); print OUT1 "%f = ".sprintf("%f\n", $a); print OUT1 "%11f = ".sprintf("%11f\n", $a); print OUT1 "%.3f = ".sprintf("%.3f\n", $a); print OUT1 "%7.2f = ".sprintf("%7.2f\n", $a); print OUT1 "%07.2f = ".sprintf("%07.2f\n", $a); print OUT1 "%g = ".sprintf("%g\n", $a); print OUT1 "%G = ".sprintf("%G\n", $a); print OUT1 "%2d = ".sprintf("%2d\n", $a); print OUT1 "%02d = ".sprintf("%02d\n", $a); print OUT1 "%8d = ".sprintf("%8d\n", $a); print OUT1 "%08d = ".sprintf("%08d\n", $a); print OUT1 "%.2f = ".sprintf("%.2f\n", $a); print OUT1 "%2.2f = ".sprintf("%2.2f\n", $a); print OUT1 "%8f = ".sprintf("%8f\n", $a); print OUT1 "%8.8f = ".sprintf("%8.8f\n", $a); print OUT1 "%08f = ".sprintf("%08f\n", $a); print OUT1 "%08.f = ".sprintf("%08.f\n", $a); print OUT1 "%08.2f = ".sprintf("%08.2f\n", $a); print OUT1 "%8.3f% = ".sprintf("%8.3f%\n", $a); print OUT1 "%#b = ".sprintf("%#b\n", $a); print OUT1 "%#o = ".sprintf("%#o\n", $a); print OUT1 "%#x = ".sprintf("%#x\n", $a); print OUT1 "%#X = ".sprintf("%#X\n", $a); print OUT1 "\n"; print OUT1 "bの値は= ".sprintf("%s\n", $b); print OUT1 "bの%e = ".sprintf("%e\n", $b); print OUT1 "bの%f = ".sprintf("%f\n", $b); print OUT1 "bの%g = ".sprintf("%g\n", $b); print OUT1 "bの%G = ".sprintf("%G\n", $b); print OUT1 "\n"; print OUT1 "xの値は= ".sprintf("%s\n", $x); print OUT1 "xの%e = ".sprintf("%e\n", $x); print OUT1 "xの%f = ".sprintf("%f\n", $x); print OUT1 "xの%g = ".sprintf("%g\n", $x); print OUT1 "xの%G = ".sprintf("%G\n", $x); print OUT1 "\n"; print OUT1 "xxの値は=".sprintf("%s\n", $xx); print OUT1 "%ld = ".sprintf("%ld\n", $xx); print OUT1 "%11ld = ".sprintf("%11ld\n", $xx); print OUT1 "%.3ld = ".sprintf("%.3ld\n", $xx); print OUT1 "%7.2ld = ".sprintf("%7.2ld\n", $xx); print OUT1 "%07.2ld= ".sprintf("%07.2ld\n", $xx); print OUT1 "%d = ".sprintf("%d\n", $xx); print OUT1 "%11d = ".sprintf("%11d\n", $xx); print OUT1 "%.3d = ".sprintf("%.3d\n", $xx); print OUT1 "%7.2d = ".sprintf("%7.2d\n", $xx); print OUT1 "%07.2d = ".sprintf("%07.2d\n", $xx); print OUT1 "%lu = ".sprintf("%lu\n", $xx); print OUT1 "%11lu = ".sprintf("%11lu\n", $xx); print OUT1 "%.3lu = ".sprintf("%.3lu\n", $xx); print OUT1 "%7.2lu = ".sprintf("%7.2lu\n", $xx); print OUT1 "%07.2lu= ".sprintf("%07.2lu\n", $xx); print OUT1 "%u = ".sprintf("%u\n", $xx); print OUT1 "%11u = ".sprintf("%11u\n", $xx); print OUT1 "%.3u = ".sprintf("%.3u\n", $xx); print OUT1 "%7.2u = ".sprintf("%7.2u\n", $xx); print OUT1 "%07.2u = ".sprintf("%07.2u\n", $xx); print OUT1 "%lo = ".sprintf("%lo\n", $xx); print OUT1 "%11lo = ".sprintf("%11lo\n", $xx); print OUT1 "%.3lo = ".sprintf("%.3lo\n", $xx); print OUT1 "%7.2lo = ".sprintf("%7.2lo\n", $xx); print OUT1 "%07.2lo= ".sprintf("%07.2lo\n", $xx); print OUT1 "%o = ".sprintf("%o\n", $xx); print OUT1 "%11o = ".sprintf("%11o\n", $xx); print OUT1 "%.3o = ".sprintf("%.3o\n", $xx); print OUT1 "%7.2o = ".sprintf("%7.2o\n", $xx); print OUT1 "%07.2o = ".sprintf("%07.2o\n", $xx); print OUT1 "%lx = ".sprintf("%lx\n", $xx); print OUT1 "%11lx = ".sprintf("%11lx\n", $xx); print OUT1 "%.3lx = ".sprintf("%.3lx\n", $xx); print OUT1 "%7.2lx = ".sprintf("%7.2lx\n", $xx); print OUT1 "%07.2lx= ".sprintf("%07.2lx\n", $xx); print OUT1 "%x = ".sprintf("%x\n", $xx); print OUT1 "%11x = ".sprintf("%11x\n", $xx); print OUT1 "%.3x = ".sprintf("%.3x\n", $xx); print OUT1 "%7.2x = ".sprintf("%7.2x\n", $xx); print OUT1 "%07.2x = ".sprintf("%07.2x\n", $xx); print OUT1 "\n"; print OUT1 "cの値は= ".sprintf("%s\n", $c); print OUT1 "%d = ".sprintf("%d\n", $c); print OUT1 "%+d = ".sprintf("%+d\n", $c); print OUT1 "%10d = ".sprintf("%10d\n", $c); print OUT1 "%10.2d = ".sprintf("%10.2d\n", $c); print OUT1 "%-d = ".sprintf("%-d\n", $c); print OUT1 "%-10d = ".sprintf("%-10d\n", $c); print OUT1 "%f = ".sprintf("%f\n", $c); print OUT1 "%b = ".sprintf("%b\n", $c); print OUT1 "%o = ".sprintf("%o\n", $c); print OUT1 "%x = ".sprintf("%x\n", $c); print OUT1 "%X = ".sprintf("%X\n", $c); print OUT1 "%e = ".sprintf("%e\n", $c); print OUT1 "%11e = ".sprintf("%11e\n", $c); print OUT1 "%.3e = ".sprintf("%.3e\n", $c); print OUT1 "%7.2e = ".sprintf("%7.2e\n", $c); print OUT1 "%07.2e = ".sprintf("%07.2e\n", $c); print OUT1 "%f = ".sprintf("%f\n", $c); print OUT1 "%11f = ".sprintf("%11f\n", $c); print OUT1 "%.3f = ".sprintf("%.3f\n", $c); print OUT1 "%7.2f = ".sprintf("%7.2f\n", $c); print OUT1 "%07.2f = ".sprintf("%07.2f\n", $c); print OUT1 "%2d = ".sprintf("%2d\n", $c); print OUT1 "%02d = ".sprintf("%02d\n", $c); print OUT1 "%8d = ".sprintf("%8d\n", $c); print OUT1 "%08d = ".sprintf("%08d\n", $c); print OUT1 "%.2f = ".sprintf("%.2f\n", $c); print OUT1 "%2.2f = ".sprintf("%2.2f\n", $c); print OUT1 "%8f = ".sprintf("%8f\n", $c); print OUT1 "%8.8f = ".sprintf("%8.8f\n", $c); print OUT1 "%08f = ".sprintf("%08f\n", $c); print OUT1 "%08.f = ".sprintf("%08.f\n", $c); print OUT1 "%08.2f = ".sprintf("%08.2f\n", $c); print OUT1 "%8.3f% = ".sprintf("%8.3f%\n", $c); print OUT1 "%#b = ".sprintf("%#b\n", $c); print OUT1 "%#o = ".sprintf("%#o\n", $c); print OUT1 "%#x = ".sprintf("%#x\n", $c); print OUT1 "%#X = ".sprintf("%#X\n", $c); print OUT1 "\n"; print OUT1 "dの値は= ".sprintf("%s\n", $d); print OUT1 "dの%e = ".sprintf("%e\n", $d); print OUT1 "dの%f = ".sprintf("%f\n", $d); print OUT1 "dの%g = ".sprintf("%g\n", $d); print OUT1 "dの%G = ".sprintf("%G\n", $d); print OUT1 "\n"; print OUT1 "yの値は= ".sprintf("%s\n", $y); print OUT1 "yの%e = ".sprintf("%e\n", $y); print OUT1 "yの%f = ".sprintf("%f\n", $y); print OUT1 "yの%g = ".sprintf("%g\n", $y); print OUT1 "yの%G = ".sprintf("%G\n", $y); print OUT1 "\n"; print OUT1 "yyの値は=".sprintf("%s\n", $yy); print OUT1 "%ld = ".sprintf("%ld\n", $yy); print OUT1 "%11ld = ".sprintf("%11ld\n", $yy); print OUT1 "%.3ld = ".sprintf("%.3ld\n", $yy); print OUT1 "%7.2ld = ".sprintf("%7.2ld\n", $yy); print OUT1 "%07.2ld= ".sprintf("%07.2ld\n", $yy); print OUT1 "%d = ".sprintf("%d\n", $yy); print OUT1 "%11d = ".sprintf("%11d\n", $yy); print OUT1 "%.3d = ".sprintf("%.3d\n", $yy); print OUT1 "%7.2d = ".sprintf("%7.2d\n", $yy); print OUT1 "%07.2d= ".sprintf("%07.2d\n", $yy); print OUT1 "%lu = ".sprintf("%lu\n", $yy); print OUT1 "%11lu = ".sprintf("%11lu\n", $yy); print OUT1 "%.3lu = ".sprintf("%.3lu\n", $yy); print OUT1 "%7.2lu = ".sprintf("%7.2lu\n", $yy); print OUT1 "%07.2lu= ".sprintf("%07.2lu\n", $yy); print OUT1 "%u = ".sprintf("%u\n", $yy); print OUT1 "%11u = ".sprintf("%11u\n", $yy); print OUT1 "%.3u = ".sprintf("%.3u\n", $yy); print OUT1 "%7.2u = ".sprintf("%7.2u\n", $yy); print OUT1 "%07.2u = ".sprintf("%07.2u\n", $yy); print OUT1 "%lo = ".sprintf("%lo\n", $yy); print OUT1 "%11lo = ".sprintf("%11lo\n", $yy); print OUT1 "%.3lo = ".sprintf("%.3lo\n", $yy); print OUT1 "%7.2lo = ".sprintf("%7.2lo\n", $yy); print OUT1 "%07.2lo= ".sprintf("%07.2lo\n", $yy); print OUT1 "%o = ".sprintf("%o\n", $yy); print OUT1 "%11o = ".sprintf("%11o\n", $yy); print OUT1 "%.3o = ".sprintf("%.3o\n", $yy); print OUT1 "%7.2o = ".sprintf("%7.2o\n", $yy); print OUT1 "%07.2o = ".sprintf("%07.2o\n", $yy); print OUT1 "%lx = ".sprintf("%lx\n", $yy); print OUT1 "%11lx = ".sprintf("%11lx\n", $yy); print OUT1 "%.3lx = ".sprintf("%.3lx\n", $yy); print OUT1 "%7.2lx = ".sprintf("%7.2lx\n", $yy); print OUT1 "%07.2lx= ".sprintf("%07.2lx\n", $yy); print OUT1 "%x = ".sprintf("%x\n", $yy); print OUT1 "%11x = ".sprintf("%11x\n", $yy); print OUT1 "%.3x = ".sprintf("%.3x\n", $yy); print OUT1 "%7.2x = ".sprintf("%7.2x\n", $yy); print OUT1 "%07.2 x= ".sprintf("%07.2x\n", $yy); close(OUT1);
109の%c= m aの値は= abcdefg %10s = abcdefg %5s = abcdefg %5.s = #何もないように見えますが、5桁分のスペースが入ります。 %.2s = ab %-10s = abcdefg #gの後に3桁分のスペースが入ります。 aの値は= 1234.5678 %d = 1234 %+d = +1234 %10d = 1234 #1234の前に6桁分のスペースが入ります。 %10.2d = 1234 #1234の前に6桁分のスペースが入ります。 %-d = 1234 %-10d = 1234 %f = 1234.567800 %b = 10011010010 %o = 2322 %x = 4d2 %X = 4D2 %e = 1.234568e+003 %11e = 1.234568e+003 %.3e = 1.235e+003 %7.2e = 1.23e+003 %07.2e = 1.23e+003 %f = 1234.567800 %11f = 1234.567800 %.3f = 1234.568 %7.2f = 1234.57 %07.2f = 1234.57 %g = 1234.57 %G = 1234.57 %2d = 1234 %02d = 1234 %8d = 1234 #1234の前に4桁分のスペースが入ります。 %08d = 00001234 %.2f = 1234.57 %2.2f = 1234.57 %8f = 1234.567800 %8.8f = 1234.56780000 %08f = 1234.567800 %08.f = 00001235 %08.2f = 01234.57 %8.3f% = 1234.568% %#b = 0b10011010010 %#o = 02322 %#x = 0x4d2 %#X = 0X4D2 bの値は= 123456.789 bの%e = 1.234568e+005 bの%f = 123456.789000 bの%g = 123457 bの%G = 123457 xの値は= 1234567.89 xの%e = 1.234568e+006 xの%f = 1234567.890000 xの%g = 1.23457e+006 xの%G = 1.23457E+006 xxの値は=1234567890.45 %ld = 1234567890 %11ld = 1234567890 %.3ld = 1234567890 %7.2ld = 1234567890 %07.2ld= 1234567890 %d = 1234567890 %11d = 1234567890 %.3d = 1234567890 %7.2d = 1234567890 %07.2d = 1234567890 %lu = 1234567890 %11lu = 1234567890 %.3lu = 1234567890 %7.2lu = 1234567890 %07.2lu= 1234567890 %u = 1234567890 %11u = 1234567890 %.3u = 1234567890 %7.2u = 1234567890 %07.2u = 1234567890 %lo = 11145401322 %11lo = 11145401322 %.3lo = 11145401322 %7.2lo = 11145401322 %07.2lo= 11145401322 %o = 11145401322 %11o = 11145401322 %.3o = 11145401322 %7.2o = 11145401322 %07.2o = 11145401322 %lx = 499602d2 %11lx = 499602d2 %.3lx = 499602d2 %7.2lx = 499602d2 %07.2lx= 499602d2 %x = 499602d2 %11x = 499602d2 %.3x = 499602d2 %7.2x = 499602d2 %07.2x = 499602d2 cの値は= -1234.5678 %d = -1234 %+d = -1234 %10d = -1234 %10.2d = -1234 %-d = -1234 %-10d = -1234 %f = -1234.567800 %b = 1111111111111111111111111111111111111111111111111111101100101110 %o = 1777777777777777775456 %x = fffffffffffffb2e %X = FFFFFFFFFFFFFB2E %e = -1.234568e+003 %11e = -1.234568e+003 %.3e = -1.235e+003 %7.2e = -1.23e+003 %07.2e = -1.23e+003 %f = -1234.567800 %11f = -1234.567800 %.3f = -1234.568 %7.2f = -1234.57 %07.2f = -1234.57 %2d = -1234 %02d = -1234 %8d = -1234 %08d = -0001234 %.2f = -1234.57 %2.2f = -1234.57 %8f = -1234.567800 %8.8f = -1234.56780000 %08f = -1234.567800 %08.f = -0001235 %08.2f = -1234.57 %8.3f% = -1234.568% %#b = 0b1111111111111111111111111111111111111111111111111111101100101110 %#o = 01777777777777777775456 %#x = 0xfffffffffffffb2e %#X = 0XFFFFFFFFFFFFFB2E dの値は= -123456.789 dの%e = -1.234568e+005 dの%f = -123456.789000 dの%g = -123457 dの%G = -123457 yの値は= -1234567.89 yの%e = -1.234568e+006 yの%f = -1234567.890000 yの%g = -1.23457e+006 yの%G = -1.23457E+006 yyの値は=-1234567890.45 %ld = -1234567890 %11ld = -1234567890 %.3ld = -1234567890 %7.2ld = -1234567890 %07.2ld= -1234567890 %d = -1234567890 %11d = -1234567890 %.3d = -1234567890 %7.2d = -1234567890 %07.2d= -1234567890 %lu = 3060399406 %11lu = 3060399406 %.3lu = 3060399406 %7.2lu = 3060399406 %07.2lu= 3060399406 %u = 18446744072474983726 %11u = 18446744072474983726 %.3u = 18446744072474983726 %7.2u = 18446744072474983726 %07.2u = 18446744072474983726 %lo = 26632376456 %11lo = 26632376456 %.3lo = 26632376456 %7.2lo = 26632376456 %07.2lo= 26632376456 %o = 1777777777766632376456 %11o = 1777777777766632376456 %.3o = 1777777777766632376456 %7.2o = 1777777777766632376456 %07.2o = 1777777777766632376456 %lx = b669fd2e %11lx = b669fd2e %.3lx = b669fd2e %7.2lx = b669fd2e %07.2lx= b669fd2e %x = ffffffffb669fd2e %11x = ffffffffb669fd2e %.3x = ffffffffb669fd2e %7.2x = ffffffffb669fd2e %07.2 x= ffffffffb669fd2e