2.

Python str→int 型変換完全ガイド — int() と例外処理

編集
この記事の要点
  • 基本は int("123") で文字列を 10 進整数に変換。前後の空白は自動で無視
  • 基数を変えるなら int("0x10", 16) / int("1010", 2) / int("777", 8)
  • 不正な文字列は ValueError を投げる → try/except でハンドリング
  • 小数点を含む文字列は直接 int に渡せない → int(float("3.14"))
  • 事前チェックには s.isdigit()、ただし マイナス符号 / 全角数字 / 小数点は True にならない
  • 全角数字 / 漢数字unicodedata.numeric()str.translate で半角化してから変換
  • カンマ区切り ("1,234,567") は int(s.replace(",", ""))、または locale.atoi

int() の基本

Python では文字列を整数に変換するには組み込み関数 int() を使います。引数に文字列を渡すと 10 進整数として解釈されます。

# 基本
int("123")            # → 123
int("-42")            # → -42
int("  100  ")        # → 100   (前後の空白は無視)
int("+7")             # → 7

# 不正な文字列は ValueError
int("abc")            # ValueError: invalid literal for int() with base 10: 'abc'
int("3.14")           # ValueError (小数点 NG)
int("1,234")          # ValueError (カンマ NG)
int("")               # ValueError (空文字 NG)

基数指定 (2 進 / 8 進 / 16 進)

# 16 進
int("0x1F", 16)       # → 31
int("1F", 16)         # → 31  (0x プレフィックスなしでも可)
int("ff", 16)         # → 255 (小文字でも可)

# 2 進
int("1010", 2)        # → 10
int("0b1010", 2)      # → 10

# 8 進
int("777", 8)         # → 511
int("0o777", 8)       # → 511

# base=0 で自動判定 (プレフィックス必須)
int("0x1F", 0)        # → 31
int("0b1010", 0)      # → 10
int("0o777", 0)       # → 511
int("123", 0)         # → 123

例外ハンドリング

def safe_int(s, default=0):
    """変換失敗時はデフォルト値を返す"""
    try:
        return int(s)
    except (ValueError, TypeError):
        return default

safe_int("123")       # 123
safe_int("abc")       # 0
safe_int(None)        # 0
safe_int("3.14")      # 0

# 用途に応じて Optional でも
from typing import Optional

def to_int(s: str) -> Optional[int]:
    try:
        return int(s)
    except ValueError:
        return None

小数点を含む文字列

# 直接 int は不可
int("3.14")           # ValueError

# 一度 float を経由
int(float("3.14"))    # → 3   (切り捨て)
int(float("3.99"))    # → 3   (Python の int(float) はゼロ方向への切り捨て)
int(float("-3.99"))   # → -3  (負の数も同様)

# 四捨五入したい
round(float("3.5"))   # → 4  (バンカーズ・ラウンディング: 偶数丸め)
round(float("2.5"))   # → 2  (← 注意: 0.5 は偶数側に丸まる)

# math.floor / math.ceil でも
import math
math.floor(float("3.7"))  # → 3
math.ceil(float("3.2"))   # → 4

事前チェック: isdigit() の限界

"123".isdigit()       # True
"-123".isdigit()      # False  (- が NG)
"3.14".isdigit()      # False
"123".isdigit()    # True   (全角数字も True になる!)
"".isdigit()          # False

# isdecimal は更に厳しい (10 進数字のみ)
"123".isdecimal()     # True
"123".isdecimal()  # True

# マイナス含む整数を許可したいなら自前チェック
def is_int_str(s: str) -> bool:
    if s.startswith(("-", "+")):
        return s[1:].isdigit()
    return s.isdigit()

is_int_str("-123")    # True
is_int_str("+45")     # True
is_int_str("3.14")    # False

全角数字対応

# ✗ そのままだと NG
int("123")          # ← Python 3.0+ では実は OK だが古い文献では NG
                       # 注意: 全角数字 1 2 3 は ascii 化される実装が多い

# ✓ 明示的に半角化
import unicodedata
s = "123"
half = unicodedata.normalize("NFKC", s)
int(half)              # → 123

# 表変換でも可
zen2han = str.maketrans("0123456789", "0123456789")
int("123".translate(zen2han))   # → 123

# 漢数字は一筋縄ではいかない (専用ライブラリ kanjize 等)
unicodedata.numeric("五")          # → 5.0 (1 文字単位のみ)

カンマ区切り数値

# 単純な削除
int("1,234,567".replace(",", ""))   # → 1234567

# locale モジュール (推奨だが OS 依存)
import locale
locale.setlocale(locale.LC_ALL, "en_US.UTF-8")
locale.atoi("1,234,567")             # → 1234567

# 通貨記号や負の括弧記法も対応するなら自前パース
import re
def parse_money(s: str) -> int:
    """$1,234 / ¥1,234 / (1,234) → 整数"""
    s = s.strip()
    neg = s.startswith("(") and s.endswith(")")
    s = re.sub(r"[^\d.\-]", "", s)
    n = int(float(s)) if s else 0
    return -n if neg else n

parse_money("$1,234")    # 1234
parse_money("(¥1,234)")  # -1234

Decimal / Fraction との関係

from decimal import Decimal
from fractions import Fraction

# Decimal: 浮動小数誤差なし
Decimal("3.14")            # Decimal('3.14')
int(Decimal("3.99"))        # → 3 (切り捨て)

# Fraction: 分数
Fraction("3/4")             # Fraction(3, 4)
int(Fraction("7/2"))        # → 3 (切り捨て)

# 金額計算では float ではなく Decimal を使うのが鉄則
total = Decimal("0.1") + Decimal("0.2")  # Decimal('0.3')  正確!
float_total = 0.1 + 0.2                   # 0.30000000000000004  誤差

他言語との比較

言語str → int失敗時
Pythonint("123")ValueError
JavaScriptparseInt("123") / Number("123")NaN を返す (parseInt は寛容で部分パース)
JavaInteger.parseInt("123")NumberFormatException
C#int.Parse("123") / int.TryParseFormatException / TryParse は false
Gostrconv.Atoi("123")(int, error)
Rust"123".parse::()Result

JavaScript の parseInt が特殊で、parseInt("123abc") が 123 を返す寛容な部分パース動作。Python の int() は厳密で、全体がパース可能でないと例外。

FAQ

Q: バイト列 (bytes) を int に
A: int.from_bytes(b"\\x12\\x34", "big") でバイト列 → 整数。逆は (0x1234).to_bytes(2, "big")

Q: 16 進文字列の桁数が決まっている
A: int(s, 16) で常に変換可。0x プレフィックスはあっても無くても OK。

Q: 入力が int / str どちらか分からない
A: int(x) は数値型ならそのまま、文字列なら変換。isinstance(x, int) で先に判定するのが安全。

Q: ユーザ入力を整数として受け取りたい
A: n = int(input("数値: ")) のラップを try/except で囲む。失敗時に再入力させる関数化が定番。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 型の確認
  2. strからintへの型変換
  3. 辞書型を文字列に変換する方法