連載
» 2019年04月23日 05時00分 公開

Python入門:[Python入門]文字列の書式指定 (3/4)

[かわさきしんじ,Deep Insider編集部]

符号の表示方法の指定

 位置寄せとパディングの後には、正負の符号の表示を指定する書式指定(sign)を追加してもよい。これには、以下を指定できる。

  • '+':正数と負数の両方に常に符号を付加する
  • '-':負数にのみ符号を付加する(省略時の動作)
  • ' '(空白文字):正数の前には空白文字を付加し、負数には符号を付加する

 2番目('-')と3番目(' ')の違いは、後者を指定した場合には正数であっても空白文字の表示に1文字分の空白文字が消費されるところだ。上のコードで、置換フィールドxにのみこれを追加してみよう。

x = 1
y = -2.1
result = '{x:< 8} + {y:0=8} = {result:=8}'.format(result=x+y, x=x, y=y)
print(result)

置換フィールドxでは正符号ではなく空白文字を表示する

 書式指定の左寄せを意味する「<」と表示幅指定の「8」の間に空白文字があることに注意されたい。これを実行すると、次のようになる。

置換フィールドxの出力の違いに注意 置換フィールドxの出力の違いに注意

 2つのセルの実行結果で、左端の「1」の表示位置がほんの少し変わっているところに注目しよう。これは、1つ目のセルでは正数については符号を表示していないのに対して、2つ目のセルでは正符号の代わりに空白文字が表示されているからだ。

桁区切りの指定

 表示幅の後には、桁区切りの指定(grouping_option)を書ける。

  • ','(カンマ):3桁ごとにカンマ「,」を挿入する(10進数表記での使用可能)
  • '_'(アンダースコア):10進数として値を表示しているときには3桁ごとにアンダースコア「_」を、2進数/8進数/16進数として値を表示しているときには4桁ごとにアンダースコア「_」を表示する(数値を何進数で表示するかの指定については後述)

 変数xとyの値を変えて、これらを表示してみよう。ここでは置換フィールドxの書式指定をシンプルに「8,」(表示幅を8文字、3桁ごとにカンマを挿入)、置換フィールドresultの書式指定を「8_」(表示幅を8文字、3桁ごとにアンダースコアを挿入)に指定している。

x = 10000
y = -4.5
result = '{x:8,} + {y:08} = {result:8_}'.format(result=x+y, x=x, y=y)
print(result)

桁区切り記号の表示を指定

 実行結果を以下に示す。

1つ目の3つ目の置換フィールドでは桁区切り記号が表示されるようになった 1つ目の3つ目の置換フィールドでは桁区切り記号が表示されるようになった

有効桁数の指定

 桁区切り指定の後には、浮動小数点数を表示する際に小数点の後(または前後。後述する「表現型」に依存)に何桁を使うか(有効桁数)を指定する。このとき、桁数の直前に「.」を付加するのを忘れないようにすること。以下では、浮動小数点数値だけを幾つかの表現方法で表記してみよう。変数yの値を2つの置換フィールドで使いまわしている点にも注意しよう(置換フィールドの名前を同じにすれば、1つの変数の値を複数個所で使える)。

y = 1234.56789
result = '{y:8.8}, {y:8.2}'.format(y=y)
print(result)

小数点の前後の有効桁数を8桁にする書式指定(1つ目の置換フィールド)と、小数点前後の有効桁数を2桁にする書式指定(2つ目の置換フィールド)

 これは「小数点の前後の有効桁数を8桁にする書式指定」(1つ目の置換フィールド)と、「小数点前後の有効桁数を2桁にする書式指定」(2つ目の置換フィールド)となる。実際には、下で説明をする表示型(type)に「g」「G」を指定したのと同様だ。実行結果を以下に示す。

実行結果 実行結果

 上のコードでは表示幅に「8」を指定したが、実行結果を見ると、1つ目の出力はその幅を超過していることにも注意。1つ目の書式指定は「表示幅が8文字で、有効桁数を小数点の前後8桁」にしているので、そのようになっている。表示幅の指定は「最小限の表示幅」を指定するものなので、こうしたことが起きないようにするには、書式指定をする側が注意する必要がある。

 両方の置換フィールドは有効桁数の指定以外は同じなのに、一方は固定小数点表示になっていて、もう一方は浮動小数点表示になっている。これは表示型に「汎用フォーマット」を意味する「g」「G」を指定したときの動作だ(表示型の指定を省略すると「g」が指定されたものと見なされる)。そして、「g」「G」を指定したときには(あるいは表示型を省略したときには)、固定小数点表示と浮動小数点表示の方式で表示するかのルールが決まっているためにこのような動作になっている。

 「.有効桁数」による指定は、表示型を指定しなければ、小数点前後で数値の表示に使う桁数を定める。説明はこの後にするとして、以下では表示型として「f」(固定小数点表示)と、上で取り上げた「g」(汎用フォーマット)を指定してみよう。

y = 1234.56789
result = '{y:8.3f}, {y:12.6f}, {y:8.3g}, {y:12.6g}'.format(y=y)
print(result)

固定小数点表示と浮動小数点表示の違い

 実行結果を以下に示す。

実行結果 実行結果

 「f」を指定したときには、小数点以下の桁数が指定した値(「3」または「6」)になり、3桁を指定した置換フィールドでは有効桁数に収まるように四捨五入が行われていることが分かる。

 「g」を指定したときの動作について少し説明をしておこう。「.<桁数>」の指定があると、小数点以下の有効桁数を「<桁数> - 1」として、与えられた数値が浮動小数点数として表される。ここでは「1234.56789」を与えているので、「.3」なら「1.23×103」が、「.6」なら「1.23457×103」が得られる。小数点以下の桁数として「Xから1を引いて」いるのは、小数点の前に1桁を利用するからだろう。

 そして、得られた浮動小数点の指数部と、与えられた有効桁数とを比較して、「指数部の値が有効桁数よりも小さいと固定小数点表記」になり、「そうでなければ浮動小数点表記」になるというのが基本的なルールだ。ここでは「g」を指定した2つの置換フィールドでどちらも指数は「3」となり、「.3」を指定した置換フィールドでは「指数の3は、桁数の3よりも小さくない」ので浮動小数点表示(1.23e+03)になり、「.6」を指定した置換フィールドは「指数の3は、桁数の6よりも小さい」ので固定小数点表示(1234.57)になっている。

 どちらの方法で表示するかのルールは厳密にはより複雑なルールで決められる(小数点以下が表示されない場合もある)が、大ざっぱにはそういうものだと思っておこう。

表示型の指定

 表示型(type)には、上で見た「f」「g」以外にも以下のようなものが指定できる(一部)。

表示型(type) 説明
「b」 2進数で表示する(「b」は「binary」の「b」)
「c」 渡された数値をコードポイントとする文字を表示する(「c」は「character」の「c」)
「d」 10進数で表示する(「d」は「decimal」の「d」)
「o」 8進数で表示する(「o」は「octal」の「o」)
「x」 16進数で表示する(「x」は「hexa-decimal」の「x」)
「e」 浮動小数点数として表示する(「e」は「exponential」の「e」)
「%」 与えられた数値をパーセントで表示する
表示型の指定(一部)

 幾つかの例を以下に示す。まずは2進数/8進数/16進数での表示例から。

x = 65536 * 2 + 128
print('{x:b}, {x:#b}, {x:#_b}'.format(x=x))
print('{x:o}, {x:#o}, {x:#_o}'.format(x=x))
print('{x:x}, {x:#x}, {x:#_x}'.format(x=x))

2進数/8進数/16進数での表示例

 各行の2つ目と3つ目の置換フィールドにある「#」は別形式で表示を指定するものだ。2進数には「0b」を前置し、8進数には「0o」を前置し、16進数には「0x」を前置する。また、3つ目の置換フィールドにある「_」は桁区切りの指定で、この場合は4桁ごとにアンダースコア「_」が挟み込まれるようになる。実行結果は以下の通りだ。

実行結果 実行結果

 「#」や「_」の指定を追加することで、それが何進数で表示されているのかがすぐに分かることや、桁の区切りがハッキリして見やすくなっていることに注目しよう。

 その他の表示型の使用例を以下に示す。

code_point = 65
f_number = -123.456789
percentage = 0.101
print('{cp:c}'.format(cp=code_point))
print('{num:e}, {num:.4e}'.format(num=f_number))
print('{p:%}, {p:.2%}'.format(p=percentage))

コードポイント/浮動小数点数/パーセンテージの表示

 実行結果を以下に示す。

実行結果 実行結果

 1行目の出力では「65」をコードポイントとする文字「A」が表示されている。2行目の出力は浮動小数点数としての表示を指示する「e」を指定したもの。「.有効桁数」の指定の有無による表示の違いに注目しよう。3行目の出力はパーセンテージ表示を指示する「%」を指定したもの。こちらも「.有効桁数」で小数点以下の表示を抑制できることに注目してほしい。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。