HOWTO · Python

Python で文字列が数値かどうかを調べる

このチュートリアルでは、Python で文字列が数値であるかどうかを確認する方法を示します。

このページの内容

文字列を Python の浮動小数点数に変換できるか確認するには、float() を呼び出し、ValueError を処理します。これは Python の浮動小数点数の構文に照らした確認です。用途によっては、無限大や NaN を拒否するといった追加ルールも必要です。

文字列が Python の数値かどうかを float() 関数で確認する

次の例を実行します。

print(float("22.23"))
22.23

float() が変換できるのは小数表記だけではありません。整数表記、符号付きの値、指数表記、および前後に空白がある値も変換できます。たとえば、"22"、"-3.5"、"1e3"、" 4.2 " です。"developer" や "2.3.4" のように浮動小数点数の構文に従わない文字列では、ValueError が発生します。

ファイルなどの外部データを扱う場合は、変換処理を小さなヘルパー関数にまとめます。変換に成功したら、値を使う必要がある場合は変換後の値を返し、失敗した場合は None を返します。こうすれば、値ごとに別の文字判定を行って検証する必要はありません。

def parse_float(value):
    try:
        return float(value)
    except ValueError:
        return None


for value in ("22.23", "developer"):
    result = parse_float(value)
    print(result)
22.23
None

変換に成功すると、ヘルパー関数は変換後の数値を返し、失敗すると None を返します。真偽値のほうが便利なら、同じ try/except ValueError のパターンを使い、変換に成功したら True、例外を処理する節では False を返します。解析できない文字列には ValueError を捕捉します。このケースを OverflowError と説明しないでください。

変換が成功しても、値が有限であるとは限りません。Python の float() は、対応する表記から無限大や NaN を生成できます。アプリケーションで有限値だけを許可する必要がある場合は、別のルールとして、変換後の値を math.isfinite() で確認します。

文字列が Python の数値かどうかを isdigit() 関数と partition() 関数で確認する

isdigit() が判定するのは、文字列内のすべての文字が数字かどうかという、より限定的な条件です。通常の小数表記、符号、指数表記では False を返すため、一般的な浮動小数点数の検証には使えません。たとえば、"4546".isdigit() は真ですが、"4546.4646".isdigit() と "-12".isdigit() は偽です。後者の2つの文字列は float() で変換できます。

partition() は、数字、小数点1つ、その後に続く数字のように、定義した限定的な形式だけをサポートする場合に使います。この関数は、最初に見つかった区切り文字の前の文字列、区切り文字そのもの、後ろの文字列を返します。そのため、各部分を明示的に確認し、ルールを限定して見直しやすくできます。

value = "4546.4646"
whole, point, fraction = value.partition(".")
is_simple_decimal = (
    value.count(".") == 1
    and point == "."
    and whole.isdigit()
    and fraction.isdigit()
)
print(is_simple_decimal)

この判定が受け入れるのは、例に示したように小数点の両側に数字がある形式です。整数のみの入力、先頭または末尾が小数点の入力、符号、前後の空白、指数表記は拒否します。Python の float() は、整数、符号付きの値、空白、指数表記など、これらの形式の一部を受け入れるため、この判定は浮動小数点数の解析と同じではありません。また、isdigit() は一部の Unicode 数字も認識します。入力形式で ASCII 数字だけが必要なら、ASCII 数字を明示的に判定してください。Python の浮動小数点数構文ではピリオドが小数点なので、"4,2" のような文字列は 4.2 に変換されません。データでロケール固有の区切り文字が使われている場合は、句読点を暗黙に置換せず、その入力形式に合わせて解析します。

手書きの判定では、こうした条件への対処を自分で定義する必要があり、Python の浮動小数点数構文とのずれも生じやすくなります。Python が変換できる値を受け入れることが目的なら、float() と ValueError の処理を使います。

value = "4546.4646"
print(value.isdigit())
print(float(value))
False
4546.4646