一般に左寄せにすることが多い文字列を右寄せにしたり、数字に正負記号をつけたり、数字の前にゼロをつけるなど文字列のフォーマットを変えたりしたいことがあります。このような場合には、sprintf関数を使います。sprintf関数は文字列のフォーマットを変換するだけですが、変換して実際に出力までしたいときにはprintf関数を使います。
sprintf関数には2つの引数が必要です。第1の引数には「書式指定文字列」、第2の引数にはフォーマットするデータ(定数でも変数でも可)を指定します。このうち、「書式指定文字列」は%[フラグ][幅][.精度]フォーマット指定子の形式で指定します([]の中は省略可能な項目を表します)。
具体的には以下のようになります。
sprintfのフラグ
| フラグ | 内 容 |
| - | データを左詰めにします(指定しないと右詰めになることに注意してください。特に文字列はこれを指定しないと右詰めになる点に注意が必要です)。 |
| + | 正の数値に「+」符号をつけます(指定しないと何もつきません。負の数値は指定の有無にかかわらず、「-」符号がつきます)。 |
| 0 | 数値の前に余った桁数があれば、「0」を埋めます。 |
| # | 2進数の時は「0b」、8進数の時は「0」、16進数の時は「0x」を数値の前につけます。 |
sprintfの幅と精度
幅または幅.精度のように指定しますが、文字列か数値かなどによって内容が異なります。
| 幅/精度 | 内 容 |
| 幅 | 文字列の場合、文字列≦幅のときは、幅で指定した桁数の領域を取り、文字列の桁数分を表示します。また、幅≦文字列のときは、文字列の桁数の領域を取り、文字列の桁数分表示します。 数値の場合は、小数点も含めた桁数を指定します。 |
| 精度 | 文字列の場合、文字列の最大桁数と幅、精度の関係は以下の表のようになります。幅≦文字列の場合、以下のように算定します。①精度と文字列を比較し、小さい方の値を精度と見なす。②①でみなした精度と幅を比較し、大きい方の値を領域とする。③①でみなした精度の桁数分の文字列を表示する。 数値の場合は、整数のフォーマット指示子 ("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のどちらか少ない桁数で表示できる形式で表示します。英字は大文字になります。 |
書式指定文字列の前後には通常の文字列を指定して表示させることもできます(冗長な形になりますが、「out1_file.print sprintf("value of 109 is %c\n", m)」としても表示できます)。
# 「value of 109 is m」のように表示されます(mに109が指定されているとき)。
printf("value of 109 is %c\n", m)
printメソッドの引数で漢字を使うため、マジックコメントを使っています。マジックコメントについては、[2-1-5.スクリプトの中で漢字を使う]を参照してください。ただし、ruby1.8以前で実行するには、$KCODEを使用します。$KCODEについても[2-1-5.スクリプトの中で漢字を使う]を参照してください。
# coding:windows-31j
・・・
out1_file = open("output.txt","w:shift_jis:utf-8")
・・・
out1_file.print "aの値は= "+sprintf("%s\n", a)
なお、rubyではsprintfを使わなくても、"書式指定文字列" % で同じようなことができます。%の後に定数や変数などをつけます。
# 以下は、"書式指定文字列" % を使った例です。 temp1 = 12345 temp2 = "%010d" % [temp1] temp2 = "%05d" % 1234 # 以下は、「ID : abcd123 」のように表示されます。 temp1 = "abcd123" temp2 = "%-5s: %8s" % [ "ID", temp1 ] out1_file.print temp2,"\n"
# coding:windows-31j
# sprintf.rb
# 内容 : sprintfのサンプルプログラム
# Copyright (c) 2011-2015 Mitsuo Minagawa, All rights reserved.
# (minagawa@fb3.so-net.ne.jp)
# 使用方法 : c:\>ruby sprintf.rb
#
# 出力ファイル
out1_file = open("output.txt","w")
a = "abcdefg"
m = 109
x = "abcdefghij"
out1_file.print sprintf("value of 109 is %c", m),"\n"
out1_file.print "109の%c= "+sprintf("%c", m),"\n"
out1_file.print "aの値は= "+sprintf("%s", a),"\n"
out1_file.print "%10s = "+sprintf("%10s", a),"\n"
out1_file.print "%5s = "+sprintf("%5s", a),"\n"
out1_file.print "%5.s = "+sprintf("%5.s", a),"\n"
out1_file.print "%.2s = "+sprintf("%.2s", a),"\n"
out1_file.print "%-10s = "+sprintf("%-10s", a),"\n"
out1_file.print "文字列:10文字 幅:15文字 精度:20文字 %15.20sと指定==>"+sprintf("%15.20s", x),"<==\n"
out1_file.print "文字列:10文字 幅:15文字 精度:15文字 %15.15sと指定==>"+sprintf("%15.15s", x),"<==\n"
out1_file.print "文字列:10文字 幅:20文字 精度:15文字 %20.15sと指定==>"+sprintf("%20.15s", x),"<==\n"
out1_file.print "文字列:10文字 幅:15文字 精度:10文字 %15.10sと指定==>"+sprintf("%15.10s", x),"<==\n"
out1_file.print "文字列:10文字 幅:15文字 精度: 7文字 %15.7s と指定==>"+sprintf("%15.7s", x),"<==\n"
out1_file.print "文字列:10文字 幅:10文字 精度:15文字 %10.15sと指定==>"+sprintf("%10.15s", x),"<==\n"
out1_file.print "文字列:10文字 幅: 7文字 精度:15文字 %7.15s と指定==>"+sprintf("%7.15s", x),"<==\n"
out1_file.print "文字列:10文字 幅: 7文字 精度:10文字 %7.10s と指定==>"+sprintf("%7.10s", x),"<==\n"
out1_file.print "文字列:10文字 幅: 5文字 精度: 7文字 %5.7s と指定==>"+sprintf("%5.7s", x),"<==\n"
out1_file.print "文字列:10文字 幅: 7文字 精度: 7文字 %7.7s と指定==>"+sprintf("%7.7s", x),"<==\n"
out1_file.print "文字列:10文字 幅: 7文字 精度: 5文字 %7.5s と指定==>"+sprintf("%7.5s", x),"<==\n"
out1_file.print "文字列:10文字 幅:10文字 精度: 7文字 %10.7s と指定==>"+sprintf("%10.7s", x),"<==\n"
a = 1234.5678
b = 123456.789
x = 1234567.89
c = -1234.5678
d = -123456.789
y = -1234567.89
out1_file.print "\n"
out1_file.print "aの値は= "+sprintf("%s", a),"\n"
out1_file.print "%d = "+sprintf("%d", a),"\n"
out1_file.print "%+d = "+sprintf("%+d", a),"\n"
out1_file.print "%10d = "+sprintf("%10d", a),"\n"
out1_file.print "%10.2d = "+sprintf("%10.2d", a),"\n"
out1_file.print "%-d = "+sprintf("%-d", a),"\n"
out1_file.print "%-10d = "+sprintf("%-10d", a),"\n"
out1_file.print "%f = "+sprintf("%f", a),"\n"
out1_file.print "%b = "+sprintf("%b", a),"\n"
out1_file.print "%o = "+sprintf("%o", a),"\n"
out1_file.print "%x = "+sprintf("%x", a),"\n"
out1_file.print "%X = "+sprintf("%X", a),"\n"
out1_file.print "%e = "+sprintf("%e", a),"\n"
out1_file.print "%11e = "+sprintf("%11e", a),"\n"
out1_file.print "%.3e = "+sprintf("%.3e", a),"\n"
out1_file.print "%7.2e = "+sprintf("%7.2e", a),"\n"
out1_file.print "%07.2e = "+sprintf("%07.2e", a),"\n"
out1_file.print "%f = "+sprintf("%f", a),"\n"
out1_file.print "%11f = "+sprintf("%11f", a),"\n"
out1_file.print "%.3f = "+sprintf("%.3f", a),"\n"
out1_file.print "%7.2f = "+sprintf("%7.2f", a),"\n"
out1_file.print "%07.2f = "+sprintf("%07.2f", a),"\n"
out1_file.print "%g = "+sprintf("%g", a),"\n"
out1_file.print "%G = "+sprintf("%G", a),"\n"
out1_file.print "%2d = "+sprintf("%2d", a),"\n"
out1_file.print "%02d = "+sprintf("%02d", a),"\n"
out1_file.print "%8d = "+sprintf("%8d", a),"\n"
out1_file.print "%08d = "+sprintf("%08d", a),"\n"
out1_file.print "%.2f = "+sprintf("%.2f", a),"\n"
out1_file.print "%2.2f = "+sprintf("%2.2f", a),"\n"
out1_file.print "%8f = "+sprintf("%8f", a),"\n"
out1_file.print "%8.8f = "+sprintf("%8.8f", a),"\n"
out1_file.print "%08f = "+sprintf("%08f", a),"\n"
out1_file.print "%08.f = "+sprintf("%08.f", a),"\n"
out1_file.print "%08.2f = "+sprintf("%08.2f", a),"\n"
out1_file.print "%8.3f% = "+sprintf("%8.3f%", a),"\n"
out1_file.print "%#b = "+sprintf("%#b", a),"\n"
out1_file.print "%#o = "+sprintf("%#o", a),"\n"
out1_file.print "%#x = "+sprintf("%#x", a),"\n"
out1_file.print "%#X = "+sprintf("%#X", a),"\n"
out1_file.print "\n"
out1_file.print "bの値は" +sprintf("%s", b),""
out1_file.print "b %e = "+sprintf("%e", b),"\n"
out1_file.print "b %f = "+sprintf("%f", b),"\n"
out1_file.print "b %g = "+sprintf("%g", b),"\n"
out1_file.print "b %G = "+sprintf("%G", b),"\n"
out1_file.print "\n"
out1_file.print "xの値は" +sprintf("%s", x),"\n"
out1_file.print "x %e = "+sprintf("%e", x),"\n"
out1_file.print "x %f = "+sprintf("%f", x),"\n"
out1_file.print "x %g = "+sprintf("%g", x),"\n"
out1_file.print "x %G = "+sprintf("%G", x),"\n"
out1_file.print "\n"
out1_file.print "cの値は= "+sprintf("%s", c),"\n"
out1_file.print "%d = "+sprintf("%d", c),"\n"
out1_file.print "%+d = "+sprintf("%+d", c),"\n"
out1_file.print "%10d = "+sprintf("%10d", c),"\n"
out1_file.print "%10.2d = "+sprintf("%10.2d", c),"\n"
out1_file.print "%-d = "+sprintf("%-d", c),"\n"
out1_file.print "%-10d = "+sprintf("%-10d", c),"\n"
out1_file.print "%f = "+sprintf("%f", c),"\n"
out1_file.print "%b = "+sprintf("%b", c),"\n"
out1_file.print "%o = "+sprintf("%o", c),"\n"
out1_file.print "%x = "+sprintf("%x", c),"\n"
out1_file.print "%X = "+sprintf("%X", c),"\n"
out1_file.print "%e = "+sprintf("%e", c),"\n"
out1_file.print "%11e = "+sprintf("%11e", c),"\n"
out1_file.print "%.3e = "+sprintf("%.3e", c),"\n"
out1_file.print "%7.2e = "+sprintf("%7.2e", c),"\n"
out1_file.print "%07.2e = "+sprintf("%07.2e", c),"\n"
out1_file.print "%f = "+sprintf("%f", c),"\n"
out1_file.print "%11f = "+sprintf("%11f", c),"\n"
out1_file.print "%.3f = "+sprintf("%.3f", c),"\n"
out1_file.print "%7.2f = "+sprintf("%7.2f", c),"\n"
out1_file.print "%07.2f = "+sprintf("%07.2f", c),"\n"
out1_file.print "%2d = "+sprintf("%2d", c),"\n"
out1_file.print "%02d = "+sprintf("%02d", c),"\n"
out1_file.print "%8d = "+sprintf("%8d", c),"\n"
out1_file.print "%08d = "+sprintf("%08d", c),"\n"
out1_file.print "%.2f = "+sprintf("%.2f", c),"\n"
out1_file.print "%2.2f = "+sprintf("%2.2f", c),"\n"
out1_file.print "%8f = "+sprintf("%8f", c),"\n"
out1_file.print "%8.8f = "+sprintf("%8.8f", c),"\n"
out1_file.print "%08f = "+sprintf("%08f", c),"\n"
out1_file.print "%08.f = "+sprintf("%08.f", c),"\n"
out1_file.print "%08.2f = "+sprintf("%08.2f", c),"\n"
out1_file.print "%8.3f% = "+sprintf("%8.3f%", c),"\n"
out1_file.print "%#b = "+sprintf("%#b", c),"\n"
out1_file.print "%#o = "+sprintf("%#o", c),"\n"
out1_file.print "%#x = "+sprintf("%#x", c),"\n"
out1_file.print "%#X = "+sprintf("%#X", c),"\n"
out1_file.print "\n"
out1_file.print "dの値は= "+sprintf("%s", d),"\n"
out1_file.print "d %e = "+sprintf("%e", d),"\n"
out1_file.print "d %f = "+sprintf("%f", d),"\n"
out1_file.print "d %g = "+sprintf("%g", d),"\n"
out1_file.print "d %G = "+sprintf("%G", d),"\n"
out1_file.print "\n"
out1_file.print "yの値は= "+sprintf("%s", y),"\n"
out1_file.print "y %e = "+sprintf("%e", y),"\n"
out1_file.print "y %f = "+sprintf("%f", y),"\n"
out1_file.print "y %g = "+sprintf("%g", y),"\n"
out1_file.print "y %G = "+sprintf("%G", y),"\n"
# ファイルのクローズ
out1_file.close
スクリプトはこちらにあります(必ずshift_jisで保存してください)。
value of 109 is m
109の%c= m
aの値は= abcdefg
%10s = abcdefg
%5s = abcdefg
%5.s = #何もないように見えますが、5桁分のスペースが入ります。
%.2s = ab
%-10s = abcdefg #abcdefgの後に3桁分のスペースが入ります。
文字列:10文字 幅:15文字 精度:20文字 %15.20sと指定==> abcdefghij<==
文字列:10文字 幅:15文字 精度:15文字 %15.15sと指定==> abcdefghij<==
文字列:10文字 幅:20文字 精度:15文字 %20.15sと指定==> abcdefghij<==
文字列:10文字 幅:15文字 精度:10文字 %15.10sと指定==> abcdefghij<==
文字列:10文字 幅:15文字 精度: 7文字 %15.7s と指定==> abcdefg<==
文字列:10文字 幅:10文字 精度:15文字 %10.15sと指定==>abcdefghij<==
文字列:10文字 幅: 7文字 精度:15文字 %7.15s と指定==>abcdefghij<==
文字列:10文字 幅: 7文字 精度:10文字 %7.10s と指定==>abcdefghij<==
文字列:10文字 幅: 5文字 精度: 7文字 %5.7s と指定==>abcdefg<==
文字列:10文字 幅: 7文字 精度: 7文字 %7.7s と指定==>abcdefg<==
文字列:10文字 幅: 7文字 精度: 5文字 %7.5s と指定==> abcde<==
文字列:10文字 幅:10文字 精度: 7文字 %10.7s と指定==> abcdefg<==
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+03
%11e = 1.234568e+03
%.3e = 1.235e+03
%7.2e = 1.23e+03
%07.2e = 1.23e+03
%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.789b %e = 1.234568e+05
b %f = 123456.789000
b %g = 123457
b %G = 123457
xの値は1234567.89
x %e = 1.234568e+06
x %f = 1234567.890000
x %g = 1.23457e+06
x %G = 1.23457E+06
cの値は= -1234.5678
%d = -1234
%+d = -1234
%10d = -1234
%10.2d = -1234
%-d = -1234
%-10d = -1234
%f = -1234.567800
%b = ..101100101110
%o = ..75456
%x = ..fb2e
%X = ..FB2E
%e = -1.234568e+03
%11e = -1.234568e+03
%.3e = -1.235e+03
%7.2e = -1.23e+03
%07.2e = -1.23e+03
%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 = 0b..101100101110
%#o = ..75456
%#x = 0x..fb2e
%#X = 0X..FB2E
dの値は= -123456.789
d %e = -1.234568e+05
d %f = -123456.789000
d %g = -123457
d %G = -123457
yの値は= -1234567.89
y %e = -1.234568e+06
y %f = -1234567.890000
y %g = -1.23457e+06
y %G = -1.23457E+06