14.文字列のフォーマット

前の講義では文字列の関数について取り扱いました。
その中でも文字列のフォーマットに関する部分は覚えることが多いので
詳しくやっていきたいと思います。

フォーマットとは文字列の出力を制御すること

文字列のフォーマットを行う方法としては3つ方法があります。

1つ目 文字列に特定のフォーマット文字をさしこんでフォーマットする。

2つ目 format関数を使う。

3つ目 文字列型のformat関数を使う。

2,3つ目はformat用の関数を使い、少しだけ書き方が違うだけでほぼほぼ一緒です。

format文字でフォーマットする方法

'文字列 %差し込みするデータがに対応する記号' % (変数)

%s : 文字列型

%d : 整数型

%f : 小数点型

%x : 16進法表記

%o : 8進法表記

%%%d : %を付けたい場合

In [1]:
errmsg = "Can't open file"
errcode = 19042
# 文字列に変数の結果を差し込む % s , %d
msg = "ERROR: %s (%d)" % (errmsg, errcode)
print(msg) 
ERROR: Can't open file (19042)

上記の例だと通常のprint関数では
文字列型のデータと数値のデータを一緒には取り扱えないが
フォーマット文字を使った差し込みであれば
%s の部分に文字列型
%dの部分に整数型のデータを差し込むことができる。

In [2]:
# 文字列型
print ("%s" % "ABC")
# 整数型
print ("%d" % 123)
# 小数点型
print ("%f" % 1.23)
# 16進法
print ("%x" % 255)
# 8進法
print ("%o" % 255)
# %を表示したい場合
print ("%%%d" % 80)
ABC
123
1.230000
ff
377
%80

フォーマットで便利な点としては、% に続く数値で
文字幅や桁数を指定することができる。

In [3]:
#=> |  ABC| : 右寄せ5文字分
print ("|%5s|"   % 'ABC')      

#=> |ABC  | : 左寄せ5文字分
print ("|%-5s|"  % 'ABC')      

#=> |  123| : 右寄せ5桁
print ("|%5d|"   % 123)     

#=> |123  | : 左寄せ5桁
print ("|%-5d|"  % 123)        

#=> | +123| : ±符号付き
print ("|%+5d|"  % 123)        

#=> | 1.23| : 全体桁数.少数点以下の桁数
print ("|%5.2f|" % 1.23)       

#=> |00123| : 0埋め
print ("|%05d|"  % 123) 
|  ABC|
|ABC  |
|  123|
|123  |
| +123|
| 1.23|
|00123|

format関数を使う方法

format(差し込むデータ , 差し込む先の文字列)

差し込む先の文字列.format(差し込むデータ)

※個人的には 文字列.format()の方が使いやすい

差し込む先の文字列には {} 波カッコ を付けて
その中に文字を差し込む。

In [4]:
aaa = 'このあとに文字を差し込む {}  差し込んだ'.format('さしこ')
print(aaa)
このあとに文字を差し込む さしこ  差し込んだ

複数個の文字の差し込みにも対応

{} 波カッコ内のインデックス番号が、format関数に入れる順番に対応する。

In [5]:
# 1番目は0、2番目は1に、3番目のデータが2のところに入る。
print('{0}-{1}-{2}'.format('100', '二百', 300))
100-二百-300

波カッコ内に任意の名前を指定し、キーワード引数として入力することも可能

In [6]:
# それぞれの名称に対応する文字が入る
print('{year}{month}{day}日'.format(year=2018, month=1, day=11))
2018年1月11日

左寄せ、中央寄せ、右寄せ

< ^ >で左寄せ、中央寄せ、右寄せができる。全体の文字数を数値で指定
埋める文字を指定することもできる。省略するとスペース。

一文字であれば全角でもOK。

{:寄せ記号 桁数}.format(数値など)

In [7]:
print('left  : {:<10}'.format(100))   # 左寄せ
print('center: {:^10}'.format(100))   # センター寄せ
print('right : {:>10}'.format(100))   # 右寄せ

print('left  : {:*<10}'.format(100))  # 左寄せ
print('center: {:a^10}'.format(100))  # センター寄せ
print('right : {:鬼>10}'.format(100)) # 右寄せ
left  : 100       
center:    100    
right :        100
left  : 100*******
center: aaa100aaaa
right : 鬼鬼鬼鬼鬼鬼鬼100

0埋め

ゼロ埋めして桁数を合わせたい場合は埋める文字を0に指定して右寄せする。

{:0桁数}.format(数値)

In [8]:
# 5けたで0埋め
print('zero padding: {:05}'.format(123))
zero padding: 00123

桁区切り(カンマ、アンダースコア)
3ケタ毎にカンマ,またはアンダースコアの区切りを入れる。

{:,}.format(数値)

なお、アンダースコアはPython3.6で追加されたオプションなので
バージョンが古い場合は使えません。

In [9]:
# カンマで3ケタ区切り
print('{:,}'.format(100000000))

# _ で3ケタ区切り
#print('{:_}'.format(100000000))
100,000,000

小数点以下の桁数指定

全体の桁数を指定するには . のあとに桁数を書く。
小数点以下の場合は固定小数点数を表す f を付ける

{:.桁数}.format(数値)
{:.桁数f}.format(数値)

In [10]:
#2桁分まで表示
print('{:.2}'.format(1.234321))

#5桁分まで表示
print('{:.5}'.format(21.23432))

# 小数点5桁分
print('{:.5f}'.format(221.234543))
1.2
21.234
221.23454