Pythonでは文字列と数値を相互に変換できるため、入力処理や計算結果の整形などに役立ちます。
この記事ではint/float/str間の基本的な変換から、エラー対処や精度・表記の注意点、さらに実用的なテクニックとベストプラクティスまで、初心者の方でも段階的に理解できるよう詳しく解説します。
- 関連記事:キーボードからの入力を受け取りたい → input()
- 関連記事:文字列と数値の型を変換したい
Pythonの文字列と数値の型変換の基本(int/float/str)
Pythonの型変換は組み込み関数int
、float
、str
を使います。
まずは最小限の正しい使い方を確認します。
str → intに変換(int)
文字列が整数表現であればint(s)
で整数に変換できます。
先頭の正負記号は許可されますが、小数点や指数表記は不可です。
# 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)や正負記号も扱えます。
# 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)
を使います。
表示を整えたい場合は後述の整形方法を使います。
# 数値 → 文字列
n = 123
x = 3.5
print(str(n)) # "123"
print(str(x)) # "3.5"
123
3.5
int ↔ floatの変換
整数から浮動小数点数へはfloat()
で、小数から整数へはint()
で変換します。
int()は小数点以下を切り捨て(0方向)である点に注意してください。
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
など不適切な型が渡された場合。
# 代表的なエラー
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'
- 関連記事:例外(Exception)入門: 実行時エラーの正しい理解
- 関連記事:try-exceptで例外処理を実装する
- 関連記事:複数exceptでエラー種類ごとに処理を分ける
- 関連記事:TypeError: ‘NoneType’ object is not iterable
空白や改行はstrip()で除去
int
やfloat
は先頭末尾のASCII空白や改行を無視できますが、ゼロ幅スペース(U+200B)などが混ざると失敗することがあります。
安全のためstrip()
や正規化を併用すると堅牢になります。
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"
のような桁区切りは直接変換できません。
不要な文字を除去してから変換します。
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)で半角へ揃えましょう。
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"))
とすると簡単ですが、非常に大きな数や厳密さが必要な場面では桁落ちの恐れがあります。
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("②")
は失敗します。
実際の変換可否の保証には使い過ぎないことが重要です。
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で安全に型変換
不正入力に備え、例外処理でフォールバックする関数を用意すると安全です。
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)を自動認識します。
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/hex
やformat
を使います。
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
を使います。
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へは不可避の誤差を持ち込みやすいです。
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)
表示用にはformat
やf-string
で桁区切りや精度指定を行います。
内部の値は数値のまま保持し、表示時だけ整形するのが基本です。
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+)?$
などの正規表現でチェックしてから変換します。
全角や桁区切りを事前に正規化除去すると安定します。
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
で統一的に扱いましょう。
ログ出力や入力値の再提示も検討します。
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
を使うか入力規則を固定します。
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へ変換すると後続処理で誤解の元になります。
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
- 関連記事:Noneとは?意味と使い方をやさしく解説
まとめ
本記事ではint/float/strの基本的な相互変換から、エラーの原因と対処法、基数変換・無限大/NaN・Decimalによる高精度処理、そして表示整形と実務での設計指針までを丁寧に解説しました。
要点は、
- 入力は正規化してから変換する
- 例外時の方針を決めて一貫した関数で扱う
- 表示整形と内部表現を分離する
の3つです。
これらを押さえれば、初心者の方でも安全で読みやすく保守しやすい数値変換が実現できます。