str.format()は文字列の書式を設定することができます。例えば、
- 小数点以下の桁数を3桁にしたい
- 文字列を右詰めして、空いた左側は*で埋めたい
- 10進数を2進数に変換して表示したい
- 数値を3桁毎にカンマ(,)で区切りたい
本記事では、str.format()の使い方と併せて、書式設定の書き方を具体例を中心にまとめます。
尚、書式設定のみをはやく知りたい!と言う場合はコチラにSkipください!
確認した環境
- OS: Ubuntu16.04LTS
- Python 3.7.4
str.format()の基本的な使い方
str.format() は文字列のメソッドで、以下の書式で用いられます。
str.format(*args, **kwargs)
ここで、文字列strは置換フィールドを含めることができます。
置換フィールドは{ }で囲われ、format()の引数が代入されます。
また、次項に述べるように書式設定もここに記述します。
>>> a = "Hibikisan"
>>> b = 10
>>> c = "カレーライス"
>>> "{0}は{1}時に{2}を食べた".format(a, b, c)
'Hibikisanは10時にカレーライスを食べた'
置換フィールド{ }の構成
置換フィールドは下記の通りfield_nameとformat_specで構成されます。
field_nameの設定方法
field_nameは、その置換フィールドがどの引数に対応しているかを表すもので、
- 数値(位置引数のインデックス)、または
- キーワード
を設定します。
- field_nameが数値の場合
下記の様に、そのインデックスに一致する位置引数を参照します。
>>> a = "A"
>>> b = "B"
>>> c = "C"
>>> "{2} - {0} - {1}".format(a, b, c)
'C - A - B'
インデックスを省略すると左から順番に引数が割り当てられます。
>>> "{} - {} - {}".format(a, b, c)
'A - B - C'
下記の通り指定されたキーワード引数を参照します。
>>> '{n3} - {n2} - {n1}'.format(n1 = a, n2 = b, n3 = c)
'C - B - A'
format_specの設定方法
format_specには以下のフォーマットで文字列の書式を設定します。
※各パラメータそれぞれの詳細はコチラ
末尾のパラメータtypeは文字種別を表しています。主な設定値は下記参照。
type | 文字種別 |
---|---|
d | 整数(10進数) |
f | 浮動小数点 |
s | 文字列 |
b/o/x | 2進数、8進数、16進数 |
以下の章では、これらそれぞれの書式設定について、具体例を挙げながら示します。
参考)公式リファレンス:string — 一般的な文字列操作 | 書式指定ミニ言語仕様
整数(10進数)の書式設定
整数(10進数)はtype=’d’に設定します。その他の書式は下記の通りです。
整数(10進数)表示(書式設定なし)
>>> a = 1234567
>>> '{:d}'.format(a)
'1234567'
フィールド幅を指定し、右寄せ/左寄せ/中央配置にする
フィールド幅(表示する文字列の幅)はwidthパラメータ、また文字列の位置(右寄せ・左寄せ・中央)はalignパラメータで設定します。(下表参照)
align | 設定内容 |
---|---|
‘>’ | 右寄せ |
‘<' | 左寄せ |
‘^’ | 中央配置 |
‘=’ | 符号の後ろをfill値でパディング |
・フィールド幅15、文字列の位置は設定なし(デフォルトで右寄せ)
>>> '{:15d}'.format(a)
' 1234567'
・右寄せ、フィールド幅15
>>> '{:>15d}'.format(a)
' 1234567'
・左寄せ、フィールド幅15
>>> '{:<15d}'.format(a)
'1234567 '
・中央配置、フィールド幅15
>>> '{:^15d}'.format(a)
' 1234567 '
空白部分を任意文字で埋める(パディング)
空白部分をどの文字で埋めるかは、fillパラメータで設定します。
・'*'でパディング、右寄せ、フィールド幅15
>>> a = 1234567
>>> '{:*>15d}'.format(a)
'********1234567'
または
>>> '{:*=15d}'.format(a)
'********1234567'
・(負の整数の場合)(-)符号の後ろを'*'でパディング
>>> b = -1234567
>>> '{:*=15d}'.format(b)
'-*******1234567'
・(負の整数の場合)(-)符号の前を'*'でパディング
>>> b = -1234567
>>> '{:*>15d}'.format(b)
'*******-1234567'
パディングの文字列を省略すると空白で穴埋めされます(こちらの方が分かりやすいかも)
>>> b = -1234567
>>> '{:=15d}'.format(b)
'- 1234567'
>>> '{:>15d}'.format(b)
' -1234567'
・"*"でパディング、左寄せ、フィールド幅15
>>> a = 1234567
>>> '{:*<15d}'.format(a)
'1234567********'
・ゼロ(0)パディング(2つのやり方があります)
# [fill][align]パラメータを使う
>>> '{:0=15d}'.format(a)
'000000001234567'
# [0]パラメータを設定する
>>> '{:015d}'.format(a)
'000000001234567'
数値をカンマ(,)で3桁に区切る
grouping_option = ","を設定することで3桁区切りも出来ます。
但し、10進数の整数(type="d")の場合のみ。
2進数、8進数、16進数の場合は4桁区切りとなります。詳細はこちら
・10進数の整数を3桁に区切る(フィールド幅は15)
>>> a = 1234567
>>> '{:15,d}'.format(a)
' 1,234,567'
・10進数の整数を3桁に区切る(フィールド幅は15、*でパディング)
>>> '{:*=15,d}'.format(a)
'******1,234,567'
符号(+/-)を付ける
signを使うと、下記の様に+/-の符号を表示することができます。
sign | 設定内容 |
---|---|
'+' | 正・負の両方に符号(+/-)を付与 |
'-' | 負数だけに符号を付与 |
・正の整数にも符号(+)を付ける(フィールド幅15)
>>> a = 1234567
>>> b = -1234567
>>> '{:+15,d}'.format(a)
' +1,234,567'
>>> '{:+15,d}'.format(b)
' -1,234,567'
・負の整数のみに符号(-)を付ける(フィールド幅15)
>>> a = 1234567
>>> b = -1234567
>>> '{:-15,d}'.format(a)
' 1,234,567'
>>> '{:-15,d}'.format(b)
' -1,234,567'
※)正直、sign="-"の設定の使いみちが思いつきませんが・・・
浮動小数点の書式設定
浮動小数点は、type='f'とします。
フィールド幅の設定や文字列の位置、パディングの設定は整数(10進数)と同じですが、小数点の扱いが追加となります。
浮動小数点の表示(書式設定無し)
※特に指定がない場合は、デフォルトで小数点以下6桁表示です。
>>> a = 3.141592653589793
>>> '{:f}'.format(a)
'3.141593'
※置換フィールドに何も設定しない場合
>>> a = 3.141592653589793
>>> '{}'.format(a)
'3.141592653589793'
小数点以下の桁数を設定
.[precision]で小数点以下の桁数を指定します。ピリオドを忘れずに!
・小数点以下1桁まで表示(小数第2位を四捨五入)
>>> '{:.1f}'.format(a)
'3.1'
・小数点以下3桁まで表示(小数第4位を四捨五入)
>>> '{:.3f}'.format(a)
'3.142'
フィールド幅、文字列の位置、パディングなどの書式設定
配置(右寄せ/左寄せ/中央)、符号、3桁区切り等は整数値の場合と同じです。
・0パディング、右寄せ、フィールド幅10、小数点以下3桁まで表示
>>> a = 3.141592653589793
>>> '{:010.3f}'.format(a)
'000003.142'
または
>>> '{:0=10.3f}'.format(a)
'000003.142'
・"*"でパディング、右寄せ、フィールド幅10、小数点以下3桁まで表示
>>> '{:*>10.3f}'.format(a)
'*****3.142'
・"x"でパディング、中央寄せ、フィールド幅10、小数点以下4桁まで表示
>>> '{:x^10.4f}'.format(a)
'xx3.1416xx'
・左寄せ、符号(+)を付与、フィールド幅8、小数点以下4桁
>>> '{:<+8.3f}'.format(a)
'+3.142 '
・"*"でパディング、右寄せ、フィールド幅15、3桁区切り、小数点以下2桁
>>> '{:*>15,.2f}'.format(c)
'***3,141,592.65'
文字列の書式設定
文字列は、type='s'を設定します。フィールド幅と文字列の位置、パディングの設定のみですね。
文字列の表示(書式設定無し)
>>> s = 'abcdef'
>>> '{:s}'.format(s)
'abcdef'
フィールド幅、文字列の位置、パディングなどの書式設定
文字列の場合はデフォルトで左詰めです。
・フィールド幅15、左寄せ(デフォルト)
>>> '{:15s}'.format(s)
'abcdef '
・"*"でパディング、左寄せ、フィールド幅15
>>> '{:*<15s}'.format(s)
'abcdef*********'
・"*"でパディング、右寄せ、フィールド幅10
>>> '{:*>10s}'.format(s)
'****abcdef'
2進数、8進数、16進数の書式設定
10進数の整数を、2進数、8進数、16進数に変換することもできます。
ここで、typeの設定内容は下記です。
type | 設定内容 |
---|---|
’b’ | 2進数 |
’o’ | 8進数 |
’x’ | 16進数 |
10進数 ⇔ 2進数/8進数/16進数(書式設定なし)
※10進数から接頭辞(0b、0o、0x)付けて変換する場合は#を付けます。
・10進数 → 2進数に変換
>>> a = 1000
>>> '{:b}'.format(a)
'1111101000'
・10進数 → 2進数に変換(接頭辞0b付き)
>>> a = 1000
>>> '{:#b}'.format(a)
'0b1111101000'
・2進数 → 10進数に変換
※接頭辞"0b"がついた2進数を10進数に変換します。
>>> a = 0b1000
>>> '{:d}'.format(a)
'8'
・10進数 → 8進数に変換
>>> a = 1000
>>> '{:o}'.format(a)
'1750'
・10進数 → 8進数に変換(接頭辞0o付き)
>>> a = 1000
>>> '{:#o}'.format(a)
'0o1750'
・8進数 → 10進数に変換
※接頭辞"0o"がついた8進数を10進数に変換します。
>>> a = 0o1000
>>> '{:d}'.format(a)
'512'
・10進数 → 16進数に変換
>>> a = 1000
>>> '{:x}'.format(a)
'3e8'
・10進数 → 16進数に変換(接頭辞0x付き)
>>> a = 1000
>>> '{:#x}'.format(a)
'0x3e8'
・16進数 → 10進数に変換
※接頭辞"0x"がついた16進数を10進数に変換します。
>>> a = 0x1000
>>> '{:d}'.format(a)
'4096'
フィールド幅、文字列の位置、パディングなどの書式設定
フィールド幅、配置(右寄せ/左寄せ/中央)、パディングも整数と同様。
尚、grouping_optionパラメータを設定すると4桁区切りに出来ます(Python3.6以降)。
・フィールド幅10、10進数→16進数に変換
>>> a = 1000
>>> '{:10x}'.format(a)
' 3e8'
・左寄せ、接頭辞0b付き、フィールド幅15、10進数→2進数に変換
>>> a = 1000
>>> '{:<#15b}'.format(a)
'0b1111101000 '
・"*"でパディング、右寄せ、フィールド幅15、10進数→8進数に変換
>>> a = 1000
>>> '{:*>15o}'.format(a)
'***********1750'
・"*"でパディング、右寄せ、フィールド幅15、4桁区切り、10進数→2進数に変換
※Python3.6以降
>>> a = 1000
>>> '{:*>15_b}'.format(a)
'***11_1110_1000'
(参考)書式設定の詳細
各パラメータについて表にまとめました。
オプション名 | 設定内容 |
---|---|
[fill]align | [fill] 右寄せ・左寄せの際に空いた場所を埋める任意の文字。省略された場合はデフォルトの空白文字 [align] < :左寄せ > :右寄せ = : 符号 (があれば) の後ろを'fill'で埋める(数値型のみ有効) ^ :中央寄せ |
sign | 数値型に対してのみ有効 + :正・負の両方に符号(+/-)を付与 - :負数のみ'-'を付与(デフォルト) (空白):空白を正数の前に付け、'-'を負数の前に付与 |
[#][0]width |
# (widthの前に付与) 2進法、8進法、または16進法出力される値にそれぞれ '0b', '0o', '0x' 接頭辞を付与 0 (widthの前に付与) 符号の前を0パディングします。fill='0'且つalign:'='の設定と等価 [width]:10進数で指定 最小のフィールド幅を表す。指定が無い場合はその内容により決定 |
grouping_option |
,(カンマ) 浮動小数点数の表現型と整数の表現型 'd'に対して千の位ごとの" ,"(カンマ)を挿入。 _(アンダーバー) |
precision | 10進数を指定。'type'が f、Fの場合 :小数点以下の桁数 g、Gの場合 :小数点の前後に表示される桁数 非数型に対しては最大フィールド幅を表します。整数型には使えません。 |
type | <文字列の表現型> s :文字列 <整数の表現型> <浮動小数点数の表現型> |
参考資料:Pytho公式リファレンス 書式指定ミニ言語仕様
まとめ
str.format()を使って文字列を出力する為の書式設定の方法について、主に整数値(10進数)、浮動小数点、文字列、2進数/8進数/16進数の場合についてまとめました。
コメント
[…] 参考記事)【Python】formatを用いた書式設定の基本 […]