Python / int() / 値を整数に変換する関数
Pythonのint()は、整数形式の文字列や対応する数値を整数オブジェクトに変換します。浮動小数点数はゼロ方向に小数部分を取り除くため、int(-2.7)は-2で、四捨五入や床関数とは異なります。"12.0"のように小数点を含む文字列は直接変換できません。
基本的な変換と戻り値
int(value)はintを返し、引数を省略すると0になります。文字列は既定で10進数として読み取り、前後の空白、符号、数字間の適切なアンダースコアを許可します。論理値TrueとFalseは1と0になります。対応する形式はint()の公式リファレンスを参照してください。
必要なのはPython 3です。各例のコード全体をUTF-8のint_example.pyに保存し、python int_example.py、環境によってはpython3で実行します。他の例はファイルの内容を置き換えて独立に実行できます。
print(int())
print(int(" +123 "))
print(int("1_024"))
print(int(True), int(False))
text = "12"
number = int(text)
print(number + 3, type(number).__name__)
print(text, type(text).__name__)
期待される出力:
0
123
1024
1 0
15 int
12 str
変換結果を別の変数へ代入しても元の文字列は変わりません。"12"を変換して数値3を加えると15になります。個数の入力で論理値を許可したくない場合は、変換できるかどうかとは別に拒否してください。
ゼロ方向への切り捨てと丸め・床関数の違い
ゼロ方向への切り捨ては、正負どちらでも小数部分を取り除きます。一方、math.floor()は元の値以下の最大の整数を返すため、負数では結果が異なります。次の列は元の値、int()、math.floor()、round()の順です。
import math
for value in (2.7, -2.7):
print(value, int(value), math.floor(value), round(value))
2.7 2 2 3
-2.7 -2 -3 -3
-2.7ではint()が-2、floor()が-3になります。丸めが必要なら目的の規則に合った関数を選びます。浮動小数点数には既に表現誤差が含まれる場合があり、整数への変換で失われた本来の小数値を復元できるわけではありません。
baseで2進数・16進数の文字列を読む
int(text, base)は文字列の基数を指定します。指定可能なのは2~36または0で、0の場合は0b・0o・0xなどの接頭辞から判定します。基数を指定する場合、最初の引数は文字列や対応するバイト形式であり、数値オブジェクトではありません。
print(int("1010", 2))
print(int("ff", 16))
print(int("0xff", 0))
print(int("0b1010", 0))
print(int("010"))
print(int("010", 8))
try:
print(int("010", 0))
except ValueError:
print("ValueError")
10
255
255
10
10
8
ValueError
"010"は既定の10進数なら10、8進数を指定すると8です。base=0では接頭辞のないこの先頭ゼロの形式は拒否されます。返された整数に「16進数の表示形式」が保存されるわけではなく、表示には別途hex()やformat()を使います。
変換エラーと大きな整数の精度
不正な表現ではValueError、非対応の型ではTypeErrorが発生することがあります。無限大ではOverflowError、非数を表すNaNではValueErrorになります。次の例は想定した例外だけを捕捉して残りの入力も確認します。
for value in ("12.0", "1e3", "1,000", "", None, float("nan"), float("inf")):
try:
print(repr(value), int(value))
except (ValueError, TypeError, OverflowError) as error:
print(repr(value), type(error).__name__)
'12.0' ValueError
'1e3' ValueError
'1,000' ValueError
'' ValueError
None TypeError
nan ValueError
inf OverflowError
int(float(text))で迂回すると、小数・指数表記を読んでから小数部分を除く別の処理方針になります。大きな整数文字列は、最初のfloat変換で浮動小数点数の表現上の限界により情報を失う可能性があります。
text = "9007199254740993"
print(int(text))
print(int(float(text)))
9007199254740993
9007199254740992
整数文字列を正確に読むにはint(text)で直接変換します。Pythonの整数は固定の32ビット・64ビット範囲に制限されませんが、メモリなどの資源は有限です。Python 3.11以降では一部の基数の非常に長い変換に桁数制限も適用される場合があります。外部入力は業務に必要な長さと値の範囲に制限し、単純に制限を無効化しないでください。
文字列を0以上の個数として検証する例
変換の成功と業務上の正しさは別です。次の関数は文字列だけを受け取り、変換後に負数を拒否します。0を含む個数であり、符号・空白・アンダースコアなどint()が許す表記も意図的に許可しています。
def parse_count(text):
if not isinstance(text, str):
raise TypeError("text must be a string")
value = int(text)
if value < 0:
raise ValueError("count must be non-negative")
return value
for text in (" 3 ", "-1", "2.5", ""):
try:
print(repr(text), parse_count(text))
except ValueError:
print(repr(text), "invalid count")
' 3 ' 3
'-1' invalid count
'2.5' invalid count
'' invalid count
不正な個数はValueErrorになります。入力画面では例外処理で再入力を案内できます。数量の上限やASCII数字だけという条件が必要なら追加してください。すべての不正入力を0に変えると、本当の0とエラーを区別しにくくなります。




