Pythonのisdigit()・isdecimal()・isnumeric()の違いを徹底解説

Pythonで文字列が数字かどうかを判定する際、isdigit()isdecimal()isnumeric()の3つのメソッドがありますが、それぞれ異なる特徴を持っています。本記事では、これらのメソッドの違いを具体例とともに分かりやすく解説します。

各メソッドの基本的な違い

1. isdecimal() – 最も厳格な判定

isdecimal()は最も厳格で、0-9の10進数字のみをTrueと判定します。

print("123".isdecimal())    # True
print("123".isdecimal())  # False(全角数字)
print("Ⅴ".isdecimal())      # False(ローマ数字)

2. isdigit() – 中程度の判定

isdigit()isdecimal()の範囲に加えて、全角数字や上付き・下付き数字も認識します。

print("123".isdigit())      # True
print("123".isdigit())    # True(全角数字)
print("²³".isdigit())       # True(上付き文字)
print("Ⅴ".isdigit())        # False(ローマ数字)

3. isnumeric() – 最も柔軟な判定

isnumeric()は最も柔軟で、ローマ数字や分数なども数値として認識します。

print("123".isnumeric())    # True
print("123".isnumeric())  # True(全角数字)
print("Ⅴ".isnumeric())      # True(ローマ数字)
print("½".isnumeric())      # True(分数)

包含関係の理解

これらのメソッドには以下の包含関係があります:

isdecimal() ⊆ isdigit() ⊆ isnumeric()

つまり、isdecimal()でTrueになる文字列は必ずisdigit()isnumeric()でもTrueになります。

# 包含関係の確認例
test_strings = ["123", "123", "²", "Ⅴ", "½", "abc"]
for s in test_strings:
    print(f"'{s}': decimal={s.isdecimal()}, digit={s.isdigit()}, numeric={s.isnumeric()}")

出力結果:

'123': decimal=True, digit=True, numeric=True
'123': decimal=False, digit=True, numeric=True
'²': decimal=False, digit=True, numeric=True
'Ⅴ': decimal=False, digit=False, numeric=True
'½': decimal=False, digit=False, numeric=True
'abc': decimal=False, digit=False, numeric=False

実際の使い分け指針

isdecimal()を使う場面

  • int()関数での変換前の検証
  • 厳密な半角数字のみを受け入れたい場合
  • データベースの数値フィールドへの入力検証
user_input = "123"
if user_input.isdecimal():
    number = int(user_input)  # 安全に変換可能

isdigit()を使う場面

  • 全角数字も許可したい場合
  • 日本語環境でのユーザー入力処理
  • 上付き・下付き文字を含む数字の判定
price = "1234"  # 全角入力
if price.isdigit():
    print("数字として認識されました")

isnumeric()を使う場面

  • 幅広い数値表現を許可したい場合
  • 国際化対応が必要なアプリケーション
  • ローマ数字や分数を含む文書の解析
chapter = "Ⅴ"  # ローマ数字
if chapter.isnumeric():
    print("章番号として有効です")

よくある落とし穴と注意点

1. 空文字列とマイナス記号

すべてのメソッドで空文字列とマイナス記号はFalseになります。

print("".isdecimal())    # False
print("-123".isdigit())  # False(マイナス記号が含まれる)

2. 浮動小数点数の判定

小数点を含む文字列はすべてFalseになります。

print("12.34".isdecimal())  # False
print("12.34".isdigit())    # False  
print("12.34".isnumeric())  # False

3. int()変換との関係

isdecimal()がTrueの文字列のみ、確実にint()で変換できます。

# 安全なパターン
if text.isdecimal():
    num = int(text)  # エラーなし

# 注意が必要なパターン  
if text.isdigit():
    num = int(text)  # 全角数字でエラーの可能性

まとめ

  • isdecimal(): 半角数字(0-9)のみ – 最も厳格
  • isdigit(): 全角数字や上付き文字も含む – 中程度
  • isnumeric(): ローマ数字や分数も含む – 最も柔軟

用途に応じて適切なメソッドを選択することで、より堅牢なPythonプログラムを作成できます。一般的なWebアプリケーションでの数値入力検証にはisdecimal()、国際化対応が必要な場合はisnumeric()を使用することをお勧めします。

「らくらくPython塾」が切り開く「呪文コーディング」とは?

■プロンプトだけでオリジナルアプリを開発・公開してみた!!

■AI時代の第一歩!「AI駆動開発コース」はじめました!

テックジム東京本校で先行開始。

■テックジム東京本校

「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。

<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。

<月1開催>放送作家による映像ディレクター養成講座

<オンライン無料>ゼロから始めるPython爆速講座