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)
int()は数字だけで構成された文字列しか変換できません。英単語や記号が混ざっているとValueErrorになります。
直し方: "twenty" を "20" にします。
パターン2
1 price = int("19.99") ^ 2 print(price)
小数点を含む文字列はint()では変換できません。一度float()で変換してからint()にするか、整数部分だけの文字列にします。
直し方: "19.99" を "19" にします。
パターン3
1 count = int("" ) ^ 2 print(count)
空文字列も数値として解釈できないためValueErrorになります。input()の戻り値をそのまま変換する際に起きやすいです。
直し方: "" を "0" にします。
パターン4
1 value = int("0x10") ^ 2 print(value)
0xで始まる16進表記の文字列も、int()にbaseを指定しない限り10進数として解釈しようとして失敗します。
直し方: "0x10" を "16" にします。
パターン5
1 amount = int("1,000" ) ^ 2 print(amount)
桁区切りのカンマは数字として認識されません。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進数以外の表記を渡すと混乱しがちです。