Python - 文字列を整数型・浮動小数点数型に型変換する

整数型に型変換(キャスト)するには int()、浮動小数点数型に変換するには float() を使用します。

文字列を数値型に型変換する方法

int() と float() に、変換したい文字列を渡します。
整数(int型)           = int(<文字列>)
浮動小数点数(float型) = float(<文字列>)

サンプルコード

次のサンプルコードは 文字列 '123' を int型 へ、文字列 '123.456' を float型 へ変換します。
int_value = int('123')
float_value = float('123.456')

変換エラーに対処する

変換できない場合はエラーが発生するので、try を使用して例外を捕捉します。
try:
    int_value = int(<文字列>)
    <変換に成功した場合の処理>
except Exception as err:
    <変換に失敗した場合の処理>
else:
    <変換に成功した場合の処理>
finally:
    <常に実行される処理>
<常に実行される処理>

サンプルコード

文字列 'abcd' は int型 へ変換できないため、エラーメッセージ が表示されます。
try:
    int_value = int('abcd')
except Exception as err:
    print(err)  # 結果 = invalid literal for int() with base 10: 'abcd'

変換エラーが発生するケース

桁区切りのカンマ

カンマ(,) が含まれていると ValueError が発生します。事前に空文字列に置換するとエラーを回避できます。
int('1,000')    # ValueError: invalid literal for int() with base 10: '1,000'
float('1,000')  # ValueError: could not convert string to float: '1,000'

次のサンプルコードは replace() メソッドを使用し、カンマを空文字列に置換してから型変換します。

int_Value = int('1,000'.replace(',', ''))
print(int_Value)   # 結果 = 1000

None と 空文字列

None を渡すと TypeError、空文字列を渡すと ValueError が発生します。
int(None)      # TypeError: int() argument must be a string, a bytes-like object or a real number, not 'NoneType'
float(None)    # TypeError: float() argument must be a string or a real number, not 'NoneType'

int('')      # ValueError: invalid literal for int() with base 10: ''
float('')    # ValueError: could not convert string to float: ''

次のサンプルコードは三項演算子を使用し、変数の値が None か 空文字列 のときは 0 を返します。

str_value = None

int_value = int(str_value) if (str_value is not None) and (str_value != '') else 0
print(int_value)  # 結果 = 0

小数点

int型に変換するとき、文字列中に 小数点 が含まれていると ValueError が発生します。
int('1.1')  # ValueError: invalid literal for int() with base 10: '1.1'

n進数(2進数、8進数、16進数など)

int() の第二引数に基数(記数法)を指定できます。たとえば 2 を渡すと 2進数、16を渡すと16進数として変換されます。
print(int('100', 2))    # 結果 = 4
print(int('100', 8))    # 結果 = 64
print(int('100', 10))   # 結果 = 100
print(int('100', 16))   # 結果 = 256
print(int('100', 32))   # 結果 = 1024
print(int('100', 36))   # 結果 = 1296

プレフィックス付きの文字列を変換したい場合、第二引数に 0 を指定します。

# 2進数
print(int('0b100', 0))   # 結果 = 4
print(int('0B100', 0))   # 結果 = 4

# 8進数
print(int('0o100', 0))   # 結果 = 64
print(int('0O100', 0))   # 結果 = 64

# 16進数
print(int('0x100', 0))   # 結果 = 256
print(int('0X100', 0))   # 結果 = 256

指数表記(E表記)

E表記の指数文字列を float() に渡すと、float型に変換できます。 E は大文字でも小文字でも変換できます。
print(float('1.234E2'))    # 結果 = 123.4
print(float('1.234e2'))    # 結果 = 123.4
print(float('-1.234E2'))   # 結果 = -123.4
print(float('-1.234e2'))   # 結果 = -123.4

print(float('1.234E-2'))   # 結果 = 0.01234
print(float('1.234e-2'))   # 結果 = 0.01234
print(float('-1.234E-2'))  # 結果 = -0.01234
print(float('-1.234e-2'))  # 結果 = -0.01234

無限大(inf) と 非数(nan、not a number)

float() に 'infinity' または 'inf' を渡すと 無限大、'nan' を渡すと 非数 になります。 大文字小文字が混在してもエラーにはなりません。
# 無限大
print(float('infinity'))   # 結果 = inf
print(float('Infinity'))   # 結果 = inf
print(float('inf'))        # 結果 = inf
print(float('Inf'))        # 結果 = inf

# 非数
print(float('nan'))   # 結果 = nan
print(float('NAN'))   # 結果 = nan
print(float('Nan'))   # 結果 = nan

全角数値

全角数値も変換可能ですが、+ー符号 と 小数点 は 半角に変換しないと ValueError が発生します。
print(int('+100'))            # 結果 = 100
print(int('-100'))            # 結果 = -100

print(float('+123.456'))   # 結果 = 123.456
print(float('-123.456'))   # 結果 = -123.456
# int('+100')   # ValueError: invalid literal for int() with base 10: '+100'
# int('ー100')   # ValueError: invalid literal for int() with base 10: 'ー100'

# float('+123.456')   # ValueError: could not convert string to float: '+123.456'
# float('ー123.456')   # ValueError: could not convert string to float: 'ー123.456'

次のサンプルコードは replace() メソッドを使用し、全角記号を半角記号に変換してから型変換をします。

int('+100'.replace('+', '+'))   # 結果 = 100
int('ー100'.replace('ー', '-'))   # 結果 = -100

float('+123.456'.replace('+', '+').replace('.', '.'))   # 結果 = 123.456
float('ー123.456'.replace('ー', '-').replace('.', '.'))   # 結果 = -123.456

参考資料

検証環境