Tcl – 文字列を整形(書式化)する -format-

文字列を出力する際に桁を揃えたり、数値の表示形式を10進から16進に変更するなど、文字列を整形するには、formatコマンドを使います。

逆に文字列を、指定した書式に基づいて解析を行い、変換した値を変数に格納するにはscanコマンドを使います。

この記事は、formatコマンド使い方を紹介します。

書式

formatコマンドはC言語のsprintf関数と同じように文字列をフォーマットします。

[書式]

format formatString ?arg arg ...?

[変換指定子の書式]

%?フラグ??最小フィールド??.精度??サイズ修飾子??変換文字?

文字列(formatString)の中にある、変換指定子(%で始まる書式)に従って値(arg)を変換して、変換指定子の位置に変換した値を挿入します。

複数の変換指定子がある場合、それぞれの変換指定子は、左から順番に値(arg)に対応します。

変換指定子は、最後の変換文字を除いて省略できます。

精度は、「.」(ピリオド)とそれに続く数字で構成されています。変換文字が、eE、およびfの場合は、小数点の右側に表示される桁数を指定します。 gおよびGの場合は、小数点の両側の桁数を含めて、表示される総桁数を指定します。 sの場合は、印刷する最大文字数を指定します。 文字列がこれより長い場合、末尾の文字は削除されます。 精度が数値ではなく*で指定されている場合、formatコマンドの次の引数によって精度が決まります。

指定できる変換指定子

フラグ 意味
左寄せにする。(数値の場合デフォルトは右寄せになっている。)
+ 正の数でも符号を表記する。
空白 最初の文字が符号でない場合、スペースを追加する。
0 数値が右寄せの場合、左側をゼロで埋める。
# 書式変換文字が以下の場合
o : 先頭に0を付加する。
x : 先頭に0xを付加する。
X : 先頭に0Xを付加する。
b : 先頭に0bを付加する。
浮動小数点表記(e,E,f,g,とG) : 常に小数点を付ける。
変換文字 意味
d 整数を符号付き10進数文字列に変換します。
u 整数を符号なし10進数文字列に変換します。
i 整数を符号付き10進数文字列に変換します(dと同じ)。
o 整数を符号なし8進数文字列に変換します。
x or X 整数を符号なし16進数文字列に変換します。
b 整数を2進数文字列に変換します。※Tcl8.6で追加されました。
c 整数をそれが表すUnicode文字に変換します。
s 文字列として表記します。
f 浮動小数点数を xx.yyy の形式に変換します。(yはデフォルト6桁)
e or E 浮動小数点数を x.yyye±zz の形式に変換します。(yはデフォルト6桁)
g or G 指数が-4より小さい場合、%e、%E と同じ形式です。そうでない場合、%f と同じ形式です。
% 変換なし:%を挿入するだけです。
サイズ
修飾子
意味
h 整数を16ビットの範囲で変換します。
l 整数を64ビットの範囲で変換します。( exprコマンドのwide()関数によって生成されたものと同じ範囲 )
ll 整数を切り捨てなしで変換します。

サイズ修飾子を指定しない場合、整数値はexprコマンドのint()関数によって生成されたものと同じ範囲(少なくとも32ビットの範囲 )で変換されます。int()関数で生成される範囲は、tcl_platform(wordSize)で調べることができます。

使い方

書式と変換指定子の表を見ただけでは、使い方のイメージがつかめないと思われるので、変換指定子をどのように指定すると、どのような結果になるのか、いくつか例を紹介します。

変換文字の使用例

[例1] 10進数

# 整数を符号付き10進数に変換します。
% puts [format "%d" 123]
123
% puts [format "%d" -1]
-1

# 整数を符号なし10進数に変換します。
% puts [format "%u" -1]
4294967295

# 16進数を符号付き10進数に変換します。
% puts [format "%i" 0x10]
16

[例2] 16進数、8進数

# %x は整数を16進数で表記します。
% puts [format "%x" 16]
10
% puts [format "%x" 255]
ff
% puts [format "%x" 256]
100

# %o は整数を8進数で表記します。
% puts [format "%o" 511]
777

[例3] 2進数

# %b は整数を2進数で表記します。
% puts [format "%b" 5]
101
% puts [format "%b" 10]
1010

[例4]浮動小数点

# 17桁の浮動小数点値
% set a [expr 11/3.0]
3.6666666666666665

# デフォルトは6桁です。
% puts [format "%f" $a]
3.666667

# %e は、x.yyye±zzの形式で表示します。
% puts [format "%e" $a]
3.666667e+00

# 指数が-4より小さい場合は %e 、大きい場合 %f と同じ形式。
% puts [format "%g" 0.00000333]
3.33e-06
% puts [format "%g" 3.33333333]
3.33333

[例5] 文字列、文字

# %s は文字列で表記します。
% puts [format "%s" おはようございます]
おはようございます

# %f は数値として、$s は文字列として扱われます。
% puts [format "%f" 1.234]
1.234000
% puts [format "%s" 1.234]
1.234

# %c は整数が表すUnicode文字で表記します。
% puts [format "%c" 65]
A
% puts [format "%c" 0x3044]
い

%c の例は、Window環境でもUnix環境でも問題なく「い」と表示されます。

メモ

Tclでは内部コードにUnicodeを採用していますが、文字を出力する際に、デフォルトでは使用環境に合わせた文字コードに符号化して出力します。

出力する際の符号化方式をfconfigureコマンドまたはchanコマンドで指定することもできます。

設定されている符号化方式を確認するには以下のコマンドで確認できます。

% encoding system
utf-8

[例6]

# 変換文字に % を指定すると、%を挿入します。変換はしません。
% puts [format "%%" 123.45]
%
% puts [format "%.2f %%" 123.45]
123.45 %

% puts [format "%.2f %%" 123.45 678]
123.45 %

最小フィールド(幅)、精度の使用例

[例1] 整数

# %6d は最小6文字幅の領域に右詰めに表示します。
% puts [format "%6d" 123]
   123

# 指定した幅を超える場合は、そのまま表示します。
% puts [format "%6d" 123456789]
123456789

[例2] 浮動小数点数

# 17桁の浮動小数点数
% set a [expr 11/3.0]
3.6666666666666665

# 小数点以下のデフォルトは6桁です。
% puts [format "%f" $a]
3.666667

# %.8f は、小数点以下の精度を8桁で表記します。
% puts [format "%.8f" $a]
3.66666667

# %6.2f は、最小6文字幅で小数点以下は2桁の数値を右詰めします。
% puts [format "%6.2f" $a]
  3.67

# 精度として 0 を指定すると小数点以下を表示しません。
% puts [format "%6.0f" $a]
     4

# %6.4g は、最小6文字幅で小数点の両側の桁数を含めた4桁の数値を右詰めします。
% puts [format "%6.4g" 3.333333]
 3.333

[例3] 文字列

% set str "おはようございます"
おはようございます

# %.4s は4文字表示します。 
% puts [format "%.4s" $str]
おはよう

# %10.4s は10桁の幅に右詰めで4文字表示します。
% puts [format "%10.4s" $str]
      おはよう

フラグの使用例

[例1]

# +を指定すると正の数でも符号を表記します。
% puts [format "%+6d%8d" 123 456]
  +123     456

# -を指定すると左寄せにします。
% puts [format "%-+6d%8d" 123 456]
+123       456

# 空白を指定すると最初の文字が符号でない場合、空白を追加する。
% puts [format "% -6d%8d" 123 456]
 123       456

# 0を指定すると、左側を0で埋める。
% puts [format "%06d" 123]
000123

[例2] #を指定した場合

# 16進数では先頭に「0x」または「0X」が付きます。
% puts [format "%#x" 255]
0xff
% puts [format "%#X" 255]
0XFF

# 8進数では先頭に「0(ゼロ)」が付きます。
% puts [format "%#o" 511]
0777

# 2進数では先頭に「0b」が付きます。
% puts [format %#b 5]
0b101

# 浮動小数点数では常に小数点を表示します。
% puts [format "%#.0f" 123.45]
123.

サイズ修飾子の使用例

[例]

# int()関数で生成される範囲。4バイト(32ビット)
% set tcl_platform(wordSize)
4

# %hd は整数を16ビットの範囲で符号付き10進数に変換します。
% puts [format "%hd" 0xffff]
-1

# %hu" は整数を16ビットの範囲で符号なし10進数に変換します。
% puts [format "%hu" 0xffff]
65535

# %ld は整数を64ビットの範囲で符号付き10進数に変換します。
% puts [format "%ld" 0xffffffffffffffff]
-1

# %lu は整数を64ビットの範囲で符号なし10進数に変換します。
% puts [format "%lu" 0xffffffffffffffff]
18446744073709551615

# %lld は切り捨てなしで変換します。
% puts [format "%ld" 18446744073709551614]
-2
% puts [format "%ld" 18446744073709551615]
-1
% puts [format "%ld" 18446744073709551616]
0
% puts [format "%lld" 18446744073709551616]
18446744073709551616
% puts [format "%lld" -18446744073709551616]
-18446744073709551616

その他の使用例

[例1] RGBカラーコード

# ピンク色のカラーコード 10進数表記
set r 255
set g 192
set b 203

# 16進数表記に変換
puts [format "pink : #%02X%02X%02X" $r $g $b]

=> pink : #FFC0CB

[例2] 円の直径と面積のリストを出力

#!/bin/sh
# the next line restarts using tclsh \
exec tclsh "$0" "$@"

# 円の面積は半径×半径×円周率(π)

set PI  3.14   ;# 円周率
set len    2   ;# 直径
set step   2   ;# 増量
set max   30   ;# 最大

while {$len <= $max} {
    set area [expr {($len/2)**2*$PI}]
    puts [format "%3d %8.2f" $len $area]
    incr len +$step
} 

[実行例]

$ ./area3.tcl
  2     3.14
  4    12.56
  6    28.26
  8    50.24
 10    78.50
 12   113.04
 14   153.86
 16   200.96
 18   254.34
 20   314.00
 22   379.94
 24   452.16
 26   530.66
 28   615.44
 30   706.50

formatコマンドと逆の働きをするコマンドとしてscanコマンドがあります。scanコマンドは文字列を 指定した書式に基づいて解析を行い、変換した値を変数に格納 します。 scanコマンド の使い方はこの記事で紹介しています。
Tcl - 文字列を解析する -scan-
この記事は、変換指定子の書式の各項目(位置指定子、最大フィールド(幅)、サイズ修飾子、変換文字)に指定できる値と意味、scanコマンドの使い方を、いくつか例を使ってを紹介しています。

コメント

タイトルとURLをコピーしました