Code Fix

中級

int()に数字以外を渡したValueErrorの原因と直し方

int()に数字以外の文字を含む文字列を渡したときに出るエラーです。小数点表記や空文字列も変換できません。

エラーメッセージの読み方

Traceback (most recent call last):
main.py
ファイル名
1
行番号 — 実際にクラッシュした行
<module>
発生場所 — <module> ならトップレベル、関数名ならその関数の中
ValueError
例外クラス — 何が起きたか。ここを検索するのが最短です
invalid literal for int() with base 10: 'twenty'
詳細メッセージ — どの値が問題だったか

このエラーが出る典型パターン

パターン1

 1  age = int("twenty")
                  ^
 2  print(age)
Traceback (most recent call last): File "main.py", line 1, in <module> age = int("twenty") ^^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: 'twenty'

int()は数字だけで構成された文字列しか変換できません。英単語や記号が混ざっているとValueErrorになります。

直し方: "twenty" を "20" にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  price = int("19.99")
                   ^
 2  print(price)
Traceback (most recent call last): File "main.py", line 1, in <module> price = int("19.99") ^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: '19.99'

小数点を含む文字列はint()では変換できません。一度float()で変換してからint()にするか、整数部分だけの文字列にします。

直し方: "19.99" を "19" にします。

この問題を解いてみる →

パターン3

 1  count = int(""  )
                  ^
 2  print(count)
Traceback (most recent call last): File "main.py", line 1, in <module> count = int("") ^^^^^^^ ValueError: invalid literal for int() with base 10: ''

空文字列も数値として解釈できないためValueErrorになります。input()の戻り値をそのまま変換する際に起きやすいです。

直し方: "" を "0" にします。

この問題を解いてみる →

パターン4

 1  value = int("0x10")
                   ^
 2  print(value)
Traceback (most recent call last): File "main.py", line 1, in <module> value = int("0x10") ^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: '0x10'

0xで始まる16進表記の文字列も、int()にbaseを指定しない限り10進数として解釈しようとして失敗します。

直し方: "0x10" を "16" にします。

この問題を解いてみる →

パターン5

 1  amount = int("1,000" )
                     ^
 2  print(amount)
Traceback (most recent call last): File "main.py", line 1, in <module> amount = int("1,000") ^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: '1,000'

桁区切りのカンマは数字として認識されません。int()に渡す前にカンマを取り除く必要があります。

直し方: "1,000" を "1000" にします。

この問題を解いてみる →

よくある誤解

「数字っぽく見える文字列」でも通るとは限りません。小数点付きの文字列("19.99")はint()では変換できず、float()を経由する必要があります。

実務での勘所

int()は既定では10進数の文字列しか受け付けません。"0x1A"のような16進数表記や"0b101"のような2進数表記の文字列を渡すとValueErrorになりますが、int("1A", 16)のように第2引数で基数を明示すれば変換できます。さらにint("0x1A", 0)のように基数に0を渡すと、"0x"や"0b"といった接頭辞を見て自動的に基数を判定してくれます。単純に「数字の文字列を数値にする」以上の柔軟性がある一方、既定の呼び出し方ではこの柔軟性が生かされないため、10進数以外の表記を渡すと混乱しがちです。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)