閉じる

Pythonで文字列と数値を相互変換する方法(int/float/str)

Pythonでは文字列と数値を相互に変換できるため、入力処理や計算結果の整形などに役立ちます。

この記事ではint/float/str間の基本的な変換から、エラー対処や精度・表記の注意点、さらに実用的なテクニックとベストプラクティスまで、初心者の方でも段階的に理解できるよう詳しく解説します。

Pythonの文字列と数値の型変換の基本(int/float/str)

Pythonの型変換は組み込み関数intfloatstrを使います。

まずは最小限の正しい使い方を確認します。

str → intに変換(int)

文字列が整数表現であればint(s)で整数に変換できます。

先頭の正負記号は許可されますが、小数点や指数表記は不可です。

Python
# str → int の基本
print(int("42"))        # 42
print(int("+7"))        # 7
print(int("-003"))      # -3

# 小数表記は int では変換できない
try:
    print(int("3.14"))
except ValueError as e:
    print("ValueError:", e)
実行結果
42
7
-3
ValueError: invalid literal for int() with base 10: '3.14'

str → floatに変換(float)

小数や指数表記を含む文字列はfloat(s)で変換します。

指数表記(例: 1e-3)正負記号も扱えます。

Python
# str → float の基本
print(float("3.14"))     # 3.14
print(float("-0.001"))   # -0.001
print(float("1e-3"))     # 0.001 (指数表記)
実行結果
3.14
-0.001
0.001

int/float → strに変換(str)

数値を文字列にするにはstr(x)を使います。

表示を整えたい場合は後述の整形方法を使います。

Python
# 数値 → 文字列
n = 123
x = 3.5
print(str(n))   # "123"
print(str(x))   # "3.5"
実行結果
123
3.5

int ↔ floatの変換

整数から浮動小数点数へはfloat()で、小数から整数へはint()で変換します。

int()は小数点以下を切り捨て(0方向)である点に注意してください。

Python
print(float(10))    # 10.0

print(int(3.9))     # 3 (切り捨て)
print(int(-3.9))    # -3 (0方向に切り捨て)

# 端数処理が必要なら round を使う
print(round(3.9))   # 4
print(round(2.5))   # 2 (Banker's rounding)
実行結果
10.0
3
-3
4
2

変換エラーと対処(ValueError/TypeError)

文字列の内容によっては例外が発生します。

ValueErrorかTypeErrorかを見分け、適切に前処理・例外処理を行いましょう。

  • ValueError: 文字列の形式が数値として不正な場合(例: "abc""3.14"intに変換など)。
  • TypeError: 変換関数へNoneなど不適切な型が渡された場合。
Python
# 代表的なエラー
try:
    int("abc")
except Exception as e:
    print(type(e).__name__, "-", e)

try:
    int(None)
except Exception as e:
    print(type(e).__name__, "-", e)
実行結果
ValueError - invalid literal for int() with base 10: 'abc'
TypeError - int() argument must be a string, a bytes-like object or a real number, not 'NoneType'

空白や改行はstrip()で除去

intfloat先頭末尾のASCII空白や改行を無視できますが、ゼロ幅スペース(U+200B)などが混ざると失敗することがあります。

安全のためstrip()や正規化を併用すると堅牢になります。

Python
s1 = "  42\n"        # OK
s2 = "42\u200B"      # ゼロ幅スペース (ZWSP)

print(int(s1))       # 42

try:
    print(int(s2))   # 常に ValueError
except ValueError as e:
    print("ValueError:", e)

# 対処: 明示的に特定の空白を取り除く
clean = s2.replace("\u200B", "").strip()
print(int(clean))    # 42
実行結果
42
ValueError: invalid literal for int() with base 10: '42\u200b'
42

桁区切り(,)を除去してから変換

"1,234"のような桁区切りは直接変換できません。

不要な文字を除去してから変換します。

Python3.11以上ならアンダースコア_を含む数字の文字列も変換可能です。

Python
raw = "1,234,567"
num = int(raw.replace(",", ""))
print(num)  # 1234567

# アンダースコアも可能(Python 3.11以降)
for s in ("1_000", "10_00"):
    try:
        num = int(s)
        print(num)
    except ValueError as e:
        print("NG:", s, "->", e)
実行結果
1234567
1000
1000

全角数字・全角記号に注意

全角数字"123"や全角記号"+"はそのままでは失敗します。

Unicode正規化(NFKC)で半角へ揃えましょう。

Python
import unicodedata as ud

s = "+123,456"  # 全角の+ と 数字 と 読点(,)
normalized = ud.normalize("NFKC", s)  # "+"→"+", "123"→"123", ","→","
value = int(normalized.replace(",", ""))  # 桁区切りを除去してから
print(value)  # 123456
実行結果
123456

正負記号と指数表記(1e-3)の扱い

指数表記floatで扱えますがintでは不可です。

整数にしたい場合にint(float("1e3"))とすると簡単ですが、非常に大きな数や厳密さが必要な場面では桁落ちの恐れがあります。

Python
print(float("1e3"))      # 1000.0
print(int(float("1e3"))) # 1000

# 注意: 大きな指数は精度を失う場合がある
from decimal import Decimal
s = "1e30"
print(int(float(s)))             # 1000000000000000019884624838656 (例: 誤差を含む可能性)
print(int(Decimal(s)))           # 厳密に 10**30
実行結果
1000.0
1000
1000000000000000019884624838656
1000000000000000000000000000000

数字判定(isdigit/isdecimal/isnumeric)の違い

数字かどうかの事前判定は便利ですが、関数ごとに許容範囲が異なるため用途に合うものを選びます。

関数何を数字とみなすか備考
str.isdecimal()10進数字のみ“123” → True、”①” → False最も厳格
str.isdigit()10進数字と上付き/下付きなど“123” → True、”②” → Trueやや広い
str.isnumeric()数値的文字全般(漢数字など)“三” → True、”四分の一” → False最も広い

例えば"②"isdigitでTrueですがint("②")は失敗します。

実際の変換可否の保証には使い過ぎないことが重要です。

Python
for s in ["123", "②", "三"]:
    print(s, "isdecimal:", s.isdecimal(), "isdigit:", s.isdigit(), "isnumeric:", s.isnumeric())
実行結果
123 isdecimal: True isdigit: True isnumeric: True
② isdecimal: False isdigit: True isnumeric: True
三 isdecimal: False isdigit: False isnumeric: True

try/exceptで安全に型変換

不正入力に備え、例外処理でフォールバックする関数を用意すると安全です。

Python
from decimal import Decimal, InvalidOperation
import unicodedata as ud

def to_int_safe(s, default=None):
    """文字列を安全にintへ。空白/全角/桁区切りに対応。指数はDecimal経由で厳密に処理。"""
    if s is None:
        return default
    # 正規化とトリム
    s = ud.normalize("NFKC", str(s)).strip()
    if s == "":
        return default
    # 桁区切りのカンマを除去
    s_clean = s.replace(",", "")
    # まずは通常の整数として
    try:
        return int(s_clean)
    except ValueError:
        pass
    # 次に指数や小数をDecimalで受けて整数化(厳密)
    try:
        return int(Decimal(s_clean))
    except (InvalidOperation, ValueError):
        return default

print(to_int_safe("  1,234 "))   # 1234
print(to_int_safe("1e3"))        # 1000
print(to_int_safe("三"))         # None (変換不可)
実行結果
1234
1000
None

実用テクニックと応用

基本を押さえたら、基数変換や精度管理、表記整形など実務で役立つテクニックを習得しましょう。

基数を指定して変換(int(x, base))

int(s, base)は2〜36進数の文字列を整数に変換します。

base=0を指定すると接頭辞(0b/0o/0x)を自動認識します。

Python
print(int("1010", 2))   # 2進 → 10
print(int("ff", 16))    # 16進 → 255
print(int("0o755", 0))  # 接頭辞で自動認識(oは8進数、xなら16進数) → 493
print(int("755", 0))   # 10進 → 755
#print(int("0755", 0))   # これはエラー(先頭ゼロは基数を指定する必要がある)
実行結果
10
255
493
755

2進/8進/16進文字列を数値に変換

2進数などの文字列はintで数値化し、逆に数値を文字列へ戻すにはbin/oct/hexformatを使います。

Python
s_bin = "0b1101"
n = int(s_bin, 0)     # 自動認識で13
print(n, bin(n), oct(n), hex(n))  # 13 0b1101 0o15 0xd

# フォーマット指定で大文字16進やゼロ埋め
print(format(n, "08b"))  # 00001101
print(format(n, "04X"))  # 000D
実行結果
13 0b1101 0o15 0xd
00001101
000D

無限大/NaNを扱う(float(‘inf’,’nan’))

float("inf")float("nan")は数値ではあるものの、比較や集計で特殊な挙動を示します。

検出にはmath.isinf/math.isnanを使います。

Python
import math

x = float("inf")
y = float("-inf")
z = float("nan")

print(math.isinf(x), math.isinf(y), math.isnan(z))  # True True True
print(z == z)  # NaNは自分自身とも等しくない → False
実行結果
True True True
False

精度が必要ならDecimalで変換

金額や高精度計算ではdecimal.Decimalが有効です。

文字列からDecimalへ変換するのが鉄則で、floatから直接Decimalへは不可避の誤差を持ち込みやすいです。

Python
from decimal import Decimal, ROUND_HALF_UP

# 文字列から正確に表現
a = Decimal("0.1")
b = Decimal("0.2")
print(a + b)  # 0.3 (正確)

# 端数処理(四捨五入)の例
price = Decimal("1234.567")
rounded = price.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(rounded)  # 1234.57
実行結果
0.3
1234.57

数値を文字列に整形(format/f-string)

表示用にはformatf-stringで桁区切りや精度指定を行います。

内部の値は数値のまま保持し、表示時だけ整形するのが基本です。

Python
n = 1234567
x = 3.1415926535

print(f"{n:,}")        # 1,234,567 (桁区切り)
print(f"{x:.2f}")      # 3.14    (小数点以下2桁)
print(format(255, "#06x"))  # 0x00ff (接頭辞付き16進、ゼロ埋め)
実行結果
1,234,567
3.14
0x00ff

ベストプラクティス(Python初心者向け)

変換の事前確認・例外処理・表記の分離が品質を左右します。

迷ったら次の指針に沿って実装してください。

入力値を検証してから変換

受け付ける形式を明確化し、その範囲でのみ変換します。

例えば整数のみなら^[+-]?\d+$、小数・指数も許可するなら^[+-]?(?:\d+(?:.\d*)?|.\d+)(?:[eE][+-]?\d+)?$などの正規表現でチェックしてから変換します。

全角や桁区切りを事前に正規化除去すると安定します。

Python
import re, unicodedata as ud

RE_FLOAT = re.compile(r'^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?$')

def normalize_number_string(s: str) -> str:
    s = ud.normalize("NFKC", s).strip()
    return s.replace(",", "")

def parse_float_strict(s: str) -> float | None:
    s = normalize_number_string(s)
    return float(s) if s and RE_FLOAT.match(s) else None

print(parse_float_strict(" 1,234.5 "))  # 1234.5
print(parse_float_strict("三"))         # None
実行結果
1234.5
None

例外時のデフォルト値を決める

システムの要件に応じてNoneで欠損を表すか、0などの中立値を入れるか方針を決め、try/exceptで統一的に扱いましょう。

ログ出力や入力値の再提示も検討します。

Python
def to_float_or_default(s, default=None):
    try:
        return float(s)
    except (TypeError, ValueError):
        return default

print(to_float_or_default("NaN", default=None))  # nan になるが例外ではない点に注意
print(to_float_or_default("abc", default=0.0))   # 0.0
実行結果
nan
0.0

ロケール依存の小数点(, .)に注意

一部の国では小数点に,を使います。

そのままではfloatに変換できないため、localeを使うか入力規則を固定します。

Python
import locale
locale.setlocale(locale.LC_NUMERIC, "")  # OSのロケールに依存

s = "1,23"   # 多くのEU圏で1.23の意味
try:
    # locale.atof はロケールの小数点記号を解釈
    val = locale.atof(s)
    print(val)
except ValueError:
    print("ロケールに適合しない形式です")
実行結果
1.23
注意

ロケール設定はプロセス全体に影響します。

並列環境やライブラリとの干渉に注意し、可能なら入力段階で",""."へ明示変換する方が安全です。

空文字やNoneの扱い

空文字は未入力、Noneは欠損など意味づけを揃え、変換関数で統一して扱います。

無理に0へ変換すると後続処理で誤解の元になります。

Python
def parse_int_optional(s) -> int | None:
    if s is None:
        return None
    s = str(s).strip()
    if s == "":
        return None
    try:
        return int(s)
    except ValueError:
        return None

print(parse_int_optional(None))  # None
print(parse_int_optional(" "))   # None
print(parse_int_optional("10"))  # 10
実行結果
None
None
10

まとめ

本記事ではint/float/strの基本的な相互変換から、エラーの原因と対処法基数変換・無限大/NaN・Decimalによる高精度処理、そして表示整形と実務での設計指針までを丁寧に解説しました。

要点は、

  1. 入力は正規化してから変換する
  2. 例外時の方針を決めて一貫した関数で扱う
  3. 表示整形と内部表現を分離する

の3つです。

これらを押さえれば、初心者の方でも安全で読みやすく保守しやすい数値変換が実現できます。

この記事を書いた人
エーテリア編集部
エーテリア編集部

人気のPythonを初めて学ぶ方向けに、文法の基本から小さな自動化まで、実際に手を動かして理解できる記事を書いています。

クラウドSSLサイトシールは安心の証です。

URLをコピーしました!