PythonやNumpyArrayで数値を文字列として表示・出力したい場合に、
- 小数点以下の桁数を指定したい 3.1415926 → 3.14
- 指数表示の桁数を指定したい 6.02214e+23 → 6.02e+23
- 整数をゼロ埋めしたい 23 → 0023
のような変換をパーセント記号を使って行う方法を解説します。
パーセント記号による変換
例えばこのような形式です。
>>> x = 3.1415926535
>>> print(x)
3.1415926535
>>> print("%5.2f" % (x))
3.14
この%の後ろに続く5.2fは、5文字分のスペースに小数点以下2桁で変換することを意味します。
2つの数値を出力する場合や%6.2fの場合は以下のようになります。
>>> print("%5.2f%5.2f" % (x, x))
3.14 3.14
>>> print("%6.2f%6.2f" % (x, x))
3.14 3.14
また、” “で囲まれた部分は文字列ですので、
>>> print("pi = %.2f"%(x))
pi = 3.14
のように、文字列と数値を合わせて変換することも可能です。
ここでは%.2fとしていますが、これは全体の文字数を指定しない書き方です。
この%記号を使う書式は以下のような形式があります。
フォーマット | 種類 | 例 |
---|---|---|
f | 浮動小数点 | ”%.2f” % (3.1415926) 3.14 |
e | 指数表示 | ”%.2e” % (3.1415926) 3.14e+00 |
g | 自動判別 | 後述 |
d, i | 整数 | ”%d” % (3.1415926) 3 |
x | 16進数 | ”%x” % (255) ff |
s | 文字列 | ”%.2s” % (“ABCD”) AB |
ちなみにfはF、eはEのように大文字で書くことも可能で、その場合は以下のように数値中に文字が入る場合に大文字で表示されます。
>>> print("%6.2f,%6.2F"%(np.inf, np.inf))
inf, INF
>>> print("%10.2e,%10.2E"%(x,x))
3.14e+00, 3.14E+00
ちなみにこの%記号を使う方法はPython2.x系の古い書き方で、現在ではあまり推奨されていないそうです。(私はよく使ってるんですけどね)
補足
自動判別
%gを使うと有効桁数を指定して、浮動小数点表示か指数表示の短いほうを出力します。
以下は有効桁数が4桁の場合です。
>>> for i in range(10):
... print("%.4g" % (3.1415926535 * 10**i))
...
3.142
31.42
314.2
3142
3.142e+04
3.142e+05
3.142e+06
3.142e+07
3.142e+08
3.142e+09
有効桁数4桁かつ文字数10文字の場合は%10.4gを指定します。
>>> for i in range(10):
... print("%10.4g" % (3.1415926535 * 10**i))
...
3.142
31.42
314.2
3142
3.142e+04
3.142e+05
3.142e+06
3.142e+07
3.142e+08
3.142e+09
ゼロ埋め
整数表示で上位の桁をゼロで埋めたい場合はこうです。
>>> print("%5d" % (123))
123
>>> print("%05d" % (123))
00123
>>> print("%05d" % (-123))
-0123
このように、%5dを%05dにします。
文字数の下限について
浮動小数点と指数表示の場合はマイナス符号や小数点の「.」や指数の「E+00」の部分の文字があるため、以下の例では意図した文字数になりません。
>>> print("%8.2e"%(-x))
-3.14e+00
>>> print("%9.2e"%(-x))
-3.14e+00
>>> print("%10.2e"%(-x))
-3.14e+00
%8.2eも%9.2eも表示が一緒ですね。
変換後の文字列の幅を一定にしたい場合は、桁数と文字数を計算する必要があります。
整数部の桁数をN、小数部の桁数をnとすると、全体の文字数Mは以下のようになります。
文字数M | マイナス符号 | 小数点 | 指数 | |
---|---|---|---|---|
f 浮動小数点 | N+n+2 | 1文字 | 1文字 | – |
e 指数表示 | N+n+6 | 1文字 | 1文字 | 4文字 |
表示したい文字列 | 計算 | フォーマット |
---|---|---|
-3.1415 | 整数1桁+小数4桁+2=7 | %7.4f |
-3.14+00 | 整数1桁+小数2桁+6=9 | %9.2e |
文字数をオーバーする場合
fやdでは、整数部の桁数が増えると文字数を一定に保つことができません。
浮動小数点の場合は、以下のように途中から文字数が増えていきます。
>>> for i in range(10):
... print("%10.4f" % (3.1415926535 * 10**i))
...
3.1416
31.4159
314.1593
3141.5927
31415.9265
314159.2654
3141592.6535
31415926.5350
314159265.3500
3141592653.5000
整数部の桁数が大きくなる場合は、あらかじめ大きめの文字数スペースを確保しておくか、指数表示を使うしかありません。
まとめ
パーセント記号による数値-文字列変換について解説しました。
古い書式であるため、この方法は調べてもなかなか出てこない気がします。
公式のドキュメントはこちらですが、やはり古いですね。
コメント