Pythonに組み込みのint関数やfloat関数を使って文字列を数値に、逆にstr関数などを使って数値を文字列に変換する方法を紹介する。
* 本稿は2021年1月8日に公開された記事をPython 3.12.0で動作確認したものです(確認日:2023年11月1日)。
# 文字列を数値に変換
s = '1'
n = int(s) # int関数を使って文字列を整数値に変換
print(type(n), ':', n) # <class 'int'> : 1
s = '3.14159'
n = float(s) # float関数を使って文字列を浮動小数点数値に変換
print(type(n), ':', n) # <class 'float'> : 3.14159
s = '1'
n = float(s) # 整数表現の文字列も浮動小数点数値に変換できる
print(n) # 1.0
s = '1e-3'
n = float(s) # 指数表記の文字列を浮動小数点数値に変換
print(n) # 0.001
# 基数を指定して文字列を整数値に変換
s = '11'
n = int(s, 2) # 文字列を2進表記として整数値に変換
print(n) # 3
n = int(s, 8) # 文字列を8進表記として整数値に変換
print(n) # 9
n = int(s, 16) # 文字列を16進表記として整数値に変換
print(n) # 17
s = '0x10'
n = int(s, 0) # 0x/0o/0bの接頭辞付き文字列を整数値に変換するときは基数を0に
print(n) # 16
# 変換できない場合は例外
s = '1a'
n = int(s, 16) # 問題なし:文字列を16進表記として整数値に変換
print(n) # 26
n = int(s) # ValueError:'1a'を10進表記として解釈できない
s = '1,234' # カンマ入りの表記
n = int(s) # ValueError
n = int(s.replace(',', '')) # replaceメソッドでカンマを削除すればOK
print(n) # 1234
# 数値を文字列化
n = 1
s = str(n) # str関数を使って文字列'1'に
print(s) # 1
n = 1.1
s = str(n) # str関数を使って文字列'1.1'に
print(s) # 1.1
Pythonでは、以下に示すように数値と文字列とで演算を行うことはできない。
s = '10'
n = 1
result = s + n # TypeError
Pythonの哲学にある「Explicit is better than implicit」(暗黙的よりも明示的である方がよい)という言葉などにも、このことが表れている。文字列と数値を加算したときに、その加算処理は数値を文字列化して結合するのか、文字列を暗黙的に数値に変換して数値同士の加算とするのかがあいまいにならないように、こうなっているとも考えられる。このような場合、何らかの形で両者の型を一致させる必要がある。
他には、input関数を使ったユーザー入力など、数値を求める場面でも、入力された値が数値ではなく文字列であるといったこともある。
このようにPythonでは、文字列を数値に、あるいは数値を文字列に変換する必要がある場面が多々ある。本稿では主に文字列を整数値や浮動小数点数値に変換する方法を見ていく。
'1'や'1.1'のような数値を文字列として表現しているものを、数値に変換するにはPythonに組み込みのint関数やfloat関数などを使用できる(複素数値の文字列表現を数値に変換するのにもcomplex関数を使用できるが本稿では省略する)。
最も単純には、文字列をそれらの関数に渡すだけだ。以下に例を示す。
s = '1'
n = int(s) # int関数を使って文字列を整数値に変換
print(type(n), ':', n) # <class 'int'> : 1
s = '3.14159'
n = float(s) # float関数を使って文字列を浮動小数点数値に変換
print(type(n), ':', n) # <class 'float'> : 3.14159
s = '1'
n = float(s) # 整数値を表す文字列でもfloat関数に渡すと浮動小数点数値になる
print(n) # 1.0
n = int() # 引数に何も指定しないと0が返される
print(n) # 0
n = float() # 引数に何も指定しないと0.0が返される
print(n) # 0.0
最初の2つの例については特に説明の必要はないだろう。整数値(浮動小数点数値)を表す文字列をint関数(float関数)に渡して、整数値(浮動小数点数値)を得ているだけだ。次の例では、整数を文字列として表現したものをfloat関数に渡している。このときには、整数値ではなく浮動小数点数値が返される。最後の2つの例では、どちらの関数でも引数を指定していない。このときには、0(0.0)が返される。
文字列の内容が数値として解釈できない場合にはValueError例外が発生する。
s = '1a'
n = int(s) # ValueError:'1a'を10進表記として解釈できない
文字列'1a'が16進表記だとすれば、これを10進数値にすると「16×1+1×10=26」と解釈できる。しかし、int関数は以下で紹介する基数の指定を行わない限り、文字列を10進表記されたものとして解釈する。そのため、上の例ではValueError例外が発生する。
float関数が受け取る引数は1つだけだが、int関数には最大で2つの引数を指定できる。1つはもちろん、整数値に変換したい文字列表現だ。もう1つは、その文字列が何進数で表記されているかを示す基数である。以下に例を示す。
s = '1a'
n = int(s, 16) # 文字列を16進表記として整数値に変換
print(n) # 26
先ほども述べたように、16進表記の'1a'は10進数値にすると26となる。そこで、この例ではint関数の第2引数に16を指定して、文字列'1a'を整数値に変換している。その結果はもちろん26となる。
第2引数に指定できるのは0、2〜36の整数値である。0を指定した場合には、文字列が0x/0o/0bという接頭辞で始まるか(アルファベットは大文字でも小文字でもどちらでもよい)、10進数値を表す文字列である必要がある。0x(0X)はその文字列が16進表記であることを、0o(0O)は8進表記であることを、0b(0B)は2進表記であることを意味する。以下に例を示す。
s = '0x11'
n = int(s, 0) # 16進数値'11'を表す文字列を整数値(10進数値)に変換
print(n) # 17
s = '0o11'
n = int(s, 0) # 8進数値'11'を表す文字列を整数値(10進数値)に変換
print(n) # 9
s = '0B11'
n = int(s, 0) # 2進数値'11'を表す文字列を整数値(10進数値)に変換
print(n) # 3
s = '11'
n = int(s, 0) # 10進数値'11'を表す文字列を整数値(10進数値)に変換
print(n) # 11
基数に指定できる最大値は36となっている。つまり、各桁の値は0〜9の数字とa〜zの26文字のアルファベット(0〜35を表す計36種の英数字)で表現される。以下に基数として36を指定した例を示す。
s = '1z'
n = int(s, 36) # 36進数値'1z'を10進数値にすると「36×1+1×35=71」となる
print(n) # 71
基数に0を指定した場合には、上に示した3種類の接頭辞で始まる文字列か、10進表記の文字列のいずれかしか変換対象には指定できないことには注意すること。10進表記の場合は、先頭に文字「0」を前置してはいけない。
s = '0100'
n = int(s, 0) # ValueError:0が前置されていると例外
n = int(s) # OK
文字列として表現された数値には3桁ごとにカンマが含まれているような場合がある。こうした文字列を数値に変換しようとするとValueError例外が発生する。
n = 1234
s = f'{n:,}' # 整数値1234をカンマ入りの文字列に変換
print(s) # 1,234
n = int(s) # ValueError
このようなときには、カンマをあらかじめ削除しておく。
n = 1234
s = f'{n:,}' # 整数値1234をカンマ入りの文字列に変換
print(s) # 1,234
s = s.replace(',', '') # カンマを削除した文字列とする
n = int(s) # OK
print(n) # 1234
数値を文字列に変換する最も簡単な方法はstr関数を使うことだ。
n = 100
s = str(n)
print(type(s), ':', s) # <class 'str'> : 100
n = 1.23
s = str(n)
print(type(s), ':', s) # <class 'str'> : 1.23
2進数/8進数/16進表記の文字列に変換するのであれば、Pythonに組み込みのbin関数/oct関数/hex関数を使用する。
n = 100
s = bin(n) # 2進表記の文字列に変換
print(s) # 0b1100100
s = oct(n) # 8進表記の文字列に変換
print(s) # 0o144
s = hex(n) # 16進表記の文字列に変換
print(s) # 0x64
変換後の文字列は0b/0o/0xという接頭辞で始まることに注意。この他にも文字列のformatメソッドやf文字列などを使うと、数値を書式指定して文字列化することも可能だ。これらについては別稿で紹介することにする。
Copyright© Digital Advantage Corp. All Rights Reserved.