位置寄せとパディングの後には、正負の符号の表示を指定する書式指定(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)
書式指定の左寄せを意味する「<」と表示幅指定の「8」の間に空白文字があることに注意されたい。これを実行すると、次のようになる。
2つのセルの実行結果で、左端の「1」の表示位置がほんの少し変わっているところに注目しよう。これは、1つ目のセルでは正数については符号を表示していないのに対して、2つ目のセルでは正符号の代わりに空白文字が表示されているからだ。
表示幅の後には、桁区切りの指定(grouping_option)を書ける。
変数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)
実行結果を以下に示す。
桁区切り指定の後には、浮動小数点数を表示する際に小数点の後(または前後。後述する「表現型」に依存)に何桁を使うか(有効桁数)を指定する。このとき、桁数の直前に「.」を付加するのを忘れないようにすること。以下では、浮動小数点数値だけを幾つかの表現方法で表記してみよう。変数yの値を2つの置換フィールドで使いまわしている点にも注意しよう(置換フィールドの名前を同じにすれば、1つの変数の値を複数個所で使える)。
y = 1234.56789
result = '{y:8.8}, {y:8.2}'.format(y=y)
print(result)
これは「小数点の前後の有効桁数を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つ目と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.