Python3 パーセント記号による数値文字列変換

プログラミング

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
x16進数”%x” % (255)
ff
s文字列”%.2s” % (“ABCD”)
AB
フォーマット記号

ちなみにfFeEのように大文字で書くことも可能で、その場合は以下のように数値中に文字が入る場合に大文字で表示されます。

>>> 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+21文字1文字
e 指数表示N+n+61文字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

整数部の桁数が大きくなる場合は、あらかじめ大きめの文字数スペースを確保しておくか、指数表示を使うしかありません。

スポンサーリンク

まとめ

パーセント記号による数値-文字列変換について解説しました。
古い書式であるため、この方法は調べてもなかなか出てこない気がします。
公式のドキュメントはこちらですが、やはり古いですね。

コメント

タイトルとURLをコピーしました