こんにちは。
最近、Pythonを学習しています。今回は値の出力方法について、書式指定子について学習しました。書式指定子を使って、表示桁数とゼロ埋めを試してみました。この記事はその時の学習内容の備忘録です。
なお、この記事では書式指定子の一部のみを紹介しています。
Pythonを動かしている環境については簡単に言うと以下です。
- Windows 10 64bit
- python 3.9.4
- PyCharm Community Edition 2021.1 x64
より詳細は以前の記事に記載してあります。
フォーマット済み文字リテラル
フォーマット済み文字リテラルという方式があります。fまたはFの後に文字列を記述すると、その文字列の中で式を埋め込むことができます。式は波括弧で囲みます。
以下のサンプルプログラムでは変数xの値を文字列に埋め込んで出力しています。
ソース
x = 'abcd1234'
print(f'x: {x}')
結果
x: abcd1234
上記プログラムでは、変数xの値を出力しているだけです。
書式の指定をする場合は、変数の後にコロン’:’を記述します。そのあとに、以下の構文にしたがって書式を指定します。
- 構文
- [[fill]align][sign][#][0][width][grouping_option][.precision][type]
今回は上記のルールのうち、表示桁数の指定とゼロ埋めに関するものを試してみました。
10桁で値を出力
[width]を指定することで、表示桁数の幅を調節することが出来ます。
- width
- 最小の表示桁数。
今回は変数の値を10桁で表示することを試しました。以下が作成したサンプルプログラムです。
ソース
a = 'ABC1234'
b = 123
c = 12.345
d = '12345678901234'
e = 12345678901234
print(f'a:{a:10}')
print(f'b:{b:10}')
print(f'c:{c:10}')
print(f'd:{d:10}')
print(f'e:{e:10}')
結果
a:ABC1234
b: 123
c: 12.345
d:12345678901234
e:12345678901234
変数a, b, cの値は10桁より小さいので、表示桁数の残りは半角空白で表示されています。残りを埋める文字は[fill]で指定できます。上記のプログラムではその個所を省略しているので、デフォルト値である半角空白が出力されます。
文字の整列は[align]の個所に記述しますが、省略しているため変数の型に応じた初期値が設定されるようです。上記の結果を見ると、以下のように動作するようです。
変数の型 | alignの初期値 |
---|---|
文字列 | 左揃え |
整数、小数 | 右揃え |
変数d, eは変数の値が10桁を超えているため、左に詰めて表示されるようです。
左揃え、右揃え、中央揃え
[align]では文字の整列方法を指定できます。
- align
- 以下の記号を用途に応じて記述する:
記号 意味 < 左詰めで出力する。 > 右詰めで出力する。 = 符号を出力した指定をした場合、その後ろを埋める。 ^ 中央揃えで出力する。
以下では文字列、正の数、負の数の表示を試してみました。
ソース
a = 'ABC1234'
print(f'a:{a:<10}')
print(f'a:{a:>10}')
print(f'a:{a:^10}')
print('---')
b = 123
print(f'b:{b:<10}')
print(f'b:{b:>10}')
print(f'b:{b:=10}')
print(f'b:{b:^10}')
print('---')
c = -345
print(f'c:{c:<10}')
print(f'c:{c:>10}')
print(f'c:{c:=10}')
print(f'c:{c:^10}')
結果
a:ABC1234
a: ABC1234
a: ABC1234
---
b:123
b: 123
b: 123
b: 123
---
c:-345
c: -345
c:- 345
c: -345
「=」の指定は符号が出力される場合に有効のようです。[sign]を指定していない場合、負の数に対してのみ、符号が出力されます。そのため、変数cの場合に符号の後に半角空白が出力されています。
文字列に対して[align]に「=」を使うと以下のエラーが発生します。
- ValueError: ‘=’ alignment not allowed in string format specifier
そのため、サンプルプログラムの変数aの個所では「=」を使っていません。
ゼロで埋めて出力
[fill]を指定することで、指定した表示桁数の残りの部分を指定した文字で埋めることができます。
- fill
- 表示桁数が値の桁数より多いときに、残りの部分を埋める文字。
以下では、[fill]と[align]を指定してみました。
ソース
a = 'ABC1234'
print(f'a:{a:0<10}')
print(f'a:{a:0>10}')
print(f'a:{a:0^10}')
print('---')
b = 123
print(f'b:{b:0<10}')
print(f'b:{b:0>10}')
print(f'b:{b:0=10}')
print(f'b:{b:0^10}')
print('---')
c = -345
print(f'c:{c:0<10}')
print(f'c:{c:0>10}')
print(f'c:{c:0=10}')
print(f'c:{c:0^10}')
結果
a:ABC1234000
a:000ABC1234
a:0ABC123400
---
b:1230000000
b:0000000123
b:0000000123
b:0001230000
---
c:-345000000
c:000000-345
c:-000000345
c:000-345000
上記サンプルプログラムでは、[fill]に0を指定しています。桁数の残りの部分に0が出力されています。
変数の型が文字列の場合、[align]を省略することはできないようです。上記の変数aの出力で、print(f’a:{a:010}’)と記述すると、実行時に以下のエラーが出力されました。
- ValueError: ‘=’ alignment not allowed in string format specifier
変数が整数型の場合、print(f’b:{b:010}’)という書き方ができるようです。ただし、この時の「0」は[0][width]の0と解釈されているようです。
以下、整数型で[align]を省略してみました。
ソース
b = 123
c = -345
print(f'b:{b:010}')
print(f'c:{c:010}')
結果
b:0000000123
c:-000000345
負の数の符号の後ろが[fill]で指定した文字で埋められているので、[align]の値は「=」に設定されるようです。
符号を出力
[sign]を指定することにより、正の数の符号を出力することができます。
- sign
- 以下の記号を用途に応じて記述する:
記号 意味 + 正数、負数の場合、符号を出力する。 – 負数の場合、符号を出力する。 半角空白 正数の場合、半角空白を最初に出力する。負数の場合、符号を出力する。
以下のサンプルプログラムで、表示結果を確認してみました。
ソース
b = 123
c = -345
print(f'b:{b:+010}')
print(f'c:{c:+010}')
print(f'b:{b:-010}')
print(f'c:{c:-010}')
print(f'b:{b: 010}')
print(f'c:{c: 010}')
結果
b:+000000123
c:-000000345
b:0000000123
c:-000000345
b: 000000123
c:-000000345
[sign]に半角空白を指定した場合、正の数の表示では上記のように最初に半角空白が出力されました。正の数と負の数の表示を並べる場合、半角空白を指定すると見やすいかもしれません。
なお、文字列の場合に[sign]を指定すると、以下のエラーが発生しました。
- ValueError: Sign not allowed in string format specifier
以上、参考になれば幸いです。