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

Pythonで「文字列が数字だけで構成されているか」を判定したいときに便利なのが、isdecimal()メソッドです。

たとえば、ユーザーが入力した値が「123」のような10進数の数字だけなのかを確認したい場合に利用できます。

本記事では、Pythonのisdecimal()について、基本的な使い方から、isdigit()isnumeric()との違い、実際のプログラムでの活用例までわかりやすく解説します。


Pythonのisdecimal()とは?

isdecimal()は、文字列が10進数として扱える文字だけで構成されているかを判定するメソッドです。

基本構文は次のとおりです。

文字列.isdecimal()

戻り値はTrueまたはFalseです。

基本例

text = "123"

print(text.isdecimal())

実行結果:

True

「123」は10進数の数字だけで構成されているため、Trueが返ります。

一方、アルファベットを含む場合はFalseになります。

text = "123abc"

print(text.isdecimal())

実行結果:

False

isdecimal()の基本的な使い方

数字だけの場合

print("123".isdecimal())
True

文字が含まれている場合

print("123a".isdecimal())
False

小数の場合

注意したいのが、小数点を含む文字列です。

print("12.34".isdecimal())

結果:

False

.は数字ではないため、Falseになります。

つまり、isdecimal()は「数値として変換できるか」を判定するメソッドではありません。

あくまで、文字列を構成する各文字が10進数字かどうかを判定します。


マイナス記号を含む場合

print("-123".isdecimal())

結果:

False

-は10進数字ではないためです。

そのため、

"-123".isdecimal()

Falseになります。


isdecimal()は空文字列ではFalse

空文字列に対してisdecimal()を実行すると、Falseになります。

print("".isdecimal())

結果:

False

これは、空文字列には数字が1文字も含まれていないためです。


全角数字にも使える

isdecimal()の特徴の一つが、全角数字も判定できることです。

print("123".isdecimal())

結果:

True

全角の「1」「2」「3」もUnicode上の10進数字として扱われるためです。

一方、半角数字の場合も当然Trueです。

print("123".isdecimal())
True

isdecimal()isdigit()の違い

Pythonには、数字を判定するメソッドとしてisdigit()もあります。

str.isdecimal()
str.isdigit()

この2つは似ていますが、判定できる文字の範囲が異なります

一般的には、

isdecimal()よりisdigit()のほうが、数字として扱える文字の範囲が広い

と考えるとわかりやすいでしょう。

例えば、Unicodeには「上付き文字」の数字があります。

text = "²"

print(text.isdecimal())
print(text.isdigit())

結果:

False
True

²は10進数字そのものではありませんが、「digit(数字)」として扱えるためisdigit()ではTrueになります。


isdecimal()isnumeric()の違い

さらにPythonにはisnumeric()があります。

str.isnumeric()

こちらはさらに広い範囲のUnicode文字を「数値」として判定します。

例えば、漢数字の「四」です。

text = "四"

print(text.isdecimal())
print(text.isdigit())
print(text.isnumeric())

結果:

False
False
True

つまり、ざっくり整理すると次のようになります。

メソッド 判定範囲
isdecimal() 10進数字
isdigit() digitとして扱える数字
isnumeric() 数値を表すUnicode文字

isdecimal()isdigit()isnumeric()の違いを比較

具体例で比較するとわかりやすくなります。

文字列 isdecimal() isdigit() isnumeric()
"123" True True True
"123" True True True
"²" False True True
"四" False False True
"12.3" False False False
"-123" False False False
"" False False False

ポイントは、3つのメソッドは「数値として計算できるか」を判定しているわけではないということです。


isdecimal()int()の違い

「数字かどうか」を確認する方法として、int()を使う方法もあります。

例えば、

text = "123"

number = int(text)

print(number)

結果:

123

しかし、int()は文字列を整数に変換するための関数です。

一方、

text.isdecimal()

は、文字列が10進数字だけで構成されているかを確認します。

目的が違うため、使い分ける必要があります。


入力チェックにisdecimal()を使う

isdecimal()は、ユーザーからの入力値をチェックするときに便利です。

例えば、年齢の入力を受け付ける場合です。

age = input("年齢を入力してください:")

if age.isdecimal():
    print("数字が入力されました")
else:
    print("数字を入力してください")

例えば、

年齢を入力してください:25

と入力すると、

数字が入力されました

と表示されます。


isdecimal()を使って電話番号をチェックする

電話番号の入力チェックにも利用できます。

phone = input("電話番号を入力してください:")

if phone.isdecimal():
    print("数字のみで入力されています")
else:
    print("数字のみ入力してください")

ただし、実際の電話番号には-を含めるケースもあります。

例えば、

03-1234-5678

isdecimal()ではFalseになります。

そのため、ハイフンを許可したい場合は別途処理が必要です。

phone = "03-1234-5678"

phone = phone.replace("-", "")

if phone.isdecimal():
    print("電話番号として数字が入力されています")

isdecimal()を使った数字チェック

例えば、入力値が数字の場合だけ処理を実行するプログラムを作れます。

value = input("数字を入力してください:")

if value.isdecimal():
    number = int(value)
    print(number * 2)
else:
    print("数字を入力してください")

isdecimal()で確認してからint()に変換することで、入力エラーを防ぎやすくなります。


if文と組み合わせる

isdecimal()if文と組み合わせて使うケースが非常に多いです。

text = "100"

if text.isdecimal():
    print("10進数字です")

結果:

10進数字です

反対に、数字ではない場合の処理はelseで記述できます。

text = "Python"

if text.isdecimal():
    print("数字です")
else:
    print("数字ではありません")

結果:

数字ではありません

isdecimal()の戻り値はTrue・False

isdecimal()の戻り値は必ず真偽値です。

result = "123".isdecimal()

print(result)
print(type(result))

結果:

True
<class 'bool'>

そのため、条件式にそのまま利用できます。

if "123".isdecimal():
    print("OK")

isdecimal()で小数を判定できる?

できません。

例えば、

"3.14".isdecimal()

Falseです。

小数点.が含まれているためです。

小数を含む数値文字列を判定したい場合は、float()などを使う方法があります。

text = "3.14"

try:
    number = float(text)
    print("数値です")
except ValueError:
    print("数値ではありません")

このように、整数だけを許可したいのか、小数も許可したいのかによって方法を選択します。


isdecimal()で負の数を判定できる?

isdecimal()だけでは判定できません。

print("-100".isdecimal())

結果:

False

-が数字ではないからです。

負の整数を許可したい場合は、例えばint()による変換を試す方法があります。

text = "-100"

try:
    number = int(text)
    print("整数です")
except ValueError:
    print("整数ではありません")

isdecimal()を使うときの注意点

1. int型には使えない

isdecimal()文字列のメソッドです。

そのため、次のコードはエラーになります。

number = 123

number.isdecimal()

int型にはisdecimal()が存在しないためです。

文字列にしてから使います。

number = 123

print(str(number).isdecimal())

結果:

True

ただし、そもそもnumberint型だとわかっているなら、isdecimal()を使う必要はありません。


2. 小数点やマイナス記号は含められない

次のような文字列はFalseになります。

"1.5".isdecimal()
"-10".isdecimal()
"+10".isdecimal()

これらには数字以外の文字が含まれているためです。


3. 「数値として使えるか」と「数字だけか」は違う

ここは非常に重要です。

例えば、

"12.5"

は数値として扱えます。

しかし、

"12.5".isdecimal()

Falseです。

つまり、isdecimal()は、

「この文字列は数値として計算できるか?」

ではなく、

「この文字列は10進数字だけで構成されているか?」

を判定するメソッドです。


isdecimal()と正規表現の違い

数字だけかどうかを確認する方法として、正規表現を使うこともできます。

例えば、

import re

text = "123"

if re.fullmatch(r"[0-9]+", text):
    print("半角数字のみです")

ただし、単純に数字だけか確認したいのであれば、

text.isdecimal()

のほうが簡潔です。

特にPython初心者の場合は、まずisdecimal()を覚えるとよいでしょう。


isdecimal()isdigit()isnumeric()の使い分け

3つのメソッドは次のように考えるとわかりやすいでしょう。

isdecimal()

10進数字だけを判定したい場合

"123".isdecimal()

isdigit()

Unicode上でdigitとして扱われる文字まで含めて判定したい場合

"²".isdigit()

isnumeric()

漢数字など、より広い「数値」を判定したい場合

"四".isnumeric()

一般的なWebフォームなどで「数字だけ入力してください」というチェックを行う場合には、要件に応じてisdecimal()などを選択します。


よくある質問

Q1. isdecimal()は整数を判定するメソッドですか?

厳密には違います。

isdecimal()は文字列が10進数字だけで構成されているかを判定します。

"123".isdecimal()

Trueですが、

"-123".isdecimal()

Falseです。


Q2. isdecimal()は小数を判定できますか?

できません。

"1.23".isdecimal()

Falseです。

小数を含む数値かどうかを確認したい場合は、float()などを利用します。


Q3. isdecimal()は全角数字に対応していますか?

はい。

"123".isdecimal()

Trueになります。


Q4. isdecimal()isdigit()はどちらを使えばいいですか?

目的によります。

一般的な10進数字のチェックならisdecimal()、Unicode上のdigitまで含めて判定したい場合はisdigit()を検討します。


Q5. isdecimal()で漢数字を判定できますか?

例えば、

"四".isdecimal()

Falseです。

一方、

"四".isnumeric()

Trueになります。


まとめ:Pythonのisdecimal()を理解しよう

Pythonのisdecimal()は、文字列が10進数字だけで構成されているかを判定するメソッドです。

基本的な使い方は次のとおりです。

text = "123"

print(text.isdecimal())

結果:

True

一方で、小数やマイナス記号を含む文字列はFalseになります。

"12.3".isdecimal()   # False
"-123".isdecimal()   # False

また、isdigit()isnumeric()とは判定対象となるUnicode文字の範囲が異なります。

メソッド 特徴
isdecimal() 10進数字を判定
isdigit() digitとして扱える文字を判定
isnumeric() より広い数値文字を判定

「文字列が10進数字だけで構成されているか」を確認したいならisdecimal()、という基本を覚えておくと、Pythonでの入力チェックに役立ちます。

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら