【Python】数字かどうかを判定する方法を初心者向けに解説

はじめに

Pythonで値が数字かどうかを判定したい場面は意外と多いでしょう。 ユーザーからの入力やファイルの読み込み結果が本当に数値なのかを確認することは、バグを防ぎ、動作を安定させるために役立ちます。 一見すると単純そうですが、Pythonには数値を表す型が複数あり、また文字列型にも数字らしく見えるものが混じることがあります。 こういった場合に備えて、さまざまな手段を使い分けられると便利です。 ここでは、Pythonで数字かどうかを判定する基本的な方法から実務での活用例までを解説していきます。

この記事を読むとわかること

  • Python 数字かどうかを判定する主な方法
  • str.isdigit(), str.isnumeric(), str.isdecimal() の違い
  • try-except を使った例外処理による数値変換
  • 数字判定が必要になる実務シーンの例

数字かどうかを判定する基本的な考え方

Pythonで変数が数字かどうかをチェックするときは、大きく分けて2つの方向性があります。 1つは変数の「型」で判定する方法です。 もう1つは「文字列を数値型に変換してみる」方法です。

前者はすでに変数が数値型かどうかを確認したいときに便利です。 具体的には、type() 関数を使うことで、変数の型が intfloat であるかを調べられます。 一方で、ユーザー入力などで文字列として受け取ったものを扱うときは、後者の「実際に数値変換してみる」ほうが直感的です。 変換できれば数字である可能性が高く、変換できなければ文字列や記号など別の型と判断できます。

ただし、実務では単純に数字に変換できたからといって、実際に使いたい形式の数値とは限らないこともあります。 例えば、小数点や「+」「-」といった符号付きの文字列も数字とみなすかどうかは、目的次第で変わるでしょう。 このように実際の用途を考慮して、最適な判定方法を選択することが大切です。

Pythonにおけるデータ型と数字

Pythonにはさまざまなデータ型が用意されています。 その中でも数値に関する代表的な型は int(整数)と float(浮動小数点)があります。 これらの型であれば、加減乗除などの算術演算ができますし、文字列型と区別することでバリデーションやエラー処理をスムーズに行えます。

一方、文字列型は数値に見える文字列であっても、内部的には文字の並びに過ぎません。 そのため、文字列として「123」が与えられた場合でも、実際には演算できず、加算や乗算に使おうとするとエラーが出ることがあります。 ここでは、そういった文字列をきちんと数値型に変換する、または文字列のまま数字かどうかをチェックしてから処理を行う方法を紹介します。

このように、Python 数字かどうかを判定する際は、変数が何の型なのかを理解したうえで、必要に応じて文字列から数値へ変換するアプローチが重要です。

isdigit()を使った数字判定

Pythonの文字列型には、数字だけで構成されているかどうかをチェックするメソッドがいくつかあります。 もっともシンプルなものの1つが str.isdigit() です。 文字列が「0〜9」の数字のみで構成されている場合に True を返し、それ以外なら False を返します。

たとえば、次のようなコードで動作を確認できます。

text1 = "123"
text2 = "123.45"
text3 = "-100"

print(text1.isdigit())  # True
print(text2.isdigit())  # False
print(text3.isdigit())  # False

text2 は小数点が含まれているので False です。 text3 にはマイナス記号が含まれるため、これも False になります。 もし、これらを数値として扱いたい場合は、単に isdigit()True かどうかを調べるだけでは不十分かもしれません。 実務の場面ではプラスやマイナス、小数点を含む数値も受け取りたいケースがあるため、その場合は別のアプローチを使いましょう。

isnumeric()とisdecimal()の違い

str.isnumeric()str.isdecimal() も、文字列が数字かどうかを判定するときによく使われるメソッドです。 基本的には isdigit() と似ていますが、扱う文字の種類に微妙な違いがあります。

isdigit()

ASCIIの0〜9に加えて、一部の全角数字なども「数字」として判定。

isnumeric()

上記に加えて、数字として解釈できる漢数字やローマ数字なども含む場合がある。

isdecimal()

ディジット(0〜9や全角数字)を含むが、ほかの記号は除外する。

このように、それぞれカバーできる文字種が異なるため、判定対象の文字列がどのような数字表記を含みうるのかによって使い分けるとよいでしょう。 ただし、いずれのメソッドも「符号付き」「小数点付き」には対応していないので、その点は注意が必要です。

実務では、通貨単位の記号やカンマ区切り(例: 1,000)などが混在する場合もあります。こういったケースでは、文字列の前処理を挟んだり、後述するtry-exceptでの変換を試みることが多いです。

try-except構文を使った数字判定

符号や小数点を含むような、より柔軟な数字判定をしたい場合は、実際に数値型に変換してみるアプローチがおすすめです。 具体的には、int()float() を使い、変換に失敗したら ValueError を捕捉する方法がよく使われます。

def is_numeric_string(value):
    try:
        float(value)
        return True
    except ValueError:
        return False

print(is_numeric_string("123"))     # True
print(is_numeric_string("123.45"))  # True
print(is_numeric_string("-100"))    # True
print(is_numeric_string("abc"))     # False
print(is_numeric_string("1,000"))   # False

この例では、float() に変換できるかどうかで判定しています。 小数点やマイナス記号があっても変換に成功すれば、基本的には数字として扱えます。 一方、カンマが入った 1,000 は単純に float() だと変換できず、エラーが起きるため False になります。 必要に応じて文字列からカンマを取り除くなどの前処理を行えば対応できるでしょう。

try-exceptを使う利点は、文字列が数値に変換できるかどうかを手早くチェックできる点にあります。 また、変換と同時に変数を数値型として扱えるようになるため、そのまま計算処理に進むことが可能です。

実務での活用例

現場でPython 数字かどうかを判定したい代表的なケースとして、フォーム入力やファイルのデータチェックが挙げられます。 たとえば、Webアプリケーションでユーザーが登録フォームに入力する年齢や金額が正しい形式かどうかを確かめたい場合です。 このときは、try-except を使って数字変換に成功したかどうかを確認し、通れば次の処理へ移行するといったフローがよく見られます。

別の例として、CSVファイルに含まれる文字列を順番に読み込み、数値列であるかどうかをチェックしながらデータベースに登録するケースもあります。 もし期待していた列が実は文字列だったり、数字以外の記号が紛れ込んでいる場合、ValueError などの例外が発生することがあります。 このとき、try-exceptを使えば不正なデータだけをスキップし、エラー内容を記録するといった柔軟な処理を組み込みやすいです。

数字と見なせる入力形式は、プロジェクトによって大きく変わります。小数点やマイナス符号、カンマ区切りなどを許容するかどうかを仕様として明確にしておくことをおすすめします。

まとめ

ここまで、Pythonで数字かどうかを判定する複数の方法を紹介しました。 文字列が純粋な数字だけで構成されているかをチェックする場合は、isdigit() などのメソッドが便利です。 一方、符号付きや小数点付きの数字を判定したいときは、float()int() を用いた try-except 構文が力を発揮します。 実務では、入力フォームやファイル読み込みの際に文字列のバリデーションを行うことが多いので、これらの方法を組み合わせてエラーを防止するとよいでしょう。

数字判定の手段は、扱うデータの形式によって最適解が異なります。 今回紹介した複数のアプローチを目的に合わせて選び、開発やメンテナンスをスムーズに進めてみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。