文字列が数値であるかどうかを判別する方法は、
- int()を使って確認する方法
- 文字列のメソッド(isdigit, isdecimal, isnumeric)を使う方法
の2つが考えられます。どちらも標準の組み込み関数を使うものですが、後者のほうが簡単なコードで実現できます。本記事では、具体例を交えてこれらの使い方を記載すると共に、文字列メソッドそれぞれの違いについてもまとめます。
尚、小数点はピリオド(.)があるため、数値とは見なされないことに注意が必要です。
#2019/4/7 記事更新
確認した環境
- OS: Ubuntu 16.04LTS
- Python: ver3.7.2@Anaconda
int()による判別方法の例
int()に渡した文字列が数値でない場合にValueErrorとなることを利用した例です。
def is_int(s):
try:
int(s)
return True
except ValueError:
return False
実行結果を以下に示します。
>>> is_int('1')
True
>>> is_int('100')
True
>>> is_int('a')
False
>>> is_int('1.2')
False
>>> is_int('1p2')
False
文字列メソッドによる判別
文字列が「10進数字」、「数字」、「数」かどうかを判別するメソッドを下記に3つ示します。
文字列メソッド | 判別する数値の内容 | 備考 |
---|---|---|
isdecimal() | 「10進数字」かどうか | 0~9の数値以外に、 U+0660 "٠"(ARABIC-INDIC DIGIT ZERO)等も含む |
isdigit() | 「数字かどうか」 | 10進数+特殊数字 (例:U+9312 '①', カローシュティー数字) |
isnumeric() | 「数」かどうか | 数字+Unicode の数値プロパティを持つ全ての文字 (例:U+2155 "⅕"等) |
これらのメソッドは、文字列が数値の場合はTrueを、そうでなければFalseを返します。
尚、小数は”.”(ピリオド)が数値ではないため、Falseが返却されます。
いろいろな文字列を例にして、それぞれのメソッドの判定結果を調べてみます。
整数値の場合
# この場合は全てTure
>>> '1234'.isdecimal()
True
>>> '1234'.isdigit()
True
>>> '1234'.isnumeric()
True
英数字混在の場合
# この場合は全てFalse
>>> '1b34'.isdecimal()
False
>>> '1b34'.isdigit()
False
>>> '1b34'.isnumeric()
False
小数の場合
# 小数はピリオドが数字ではないためFalse
>>> '1.234'.isdecimal()
False
>>> '1.234'.isdigit()
False
>>> '1.234'.isnumeric()
False
全角数字の場合
# 全角数字も全てTrue
>>> '1'.isdecimal()
True
>>> '1'.isdigit()
True
>>> '1'.isnumeric()
True
特殊文字(例えば ‘①’:U+9312)の場合
# この特殊文字はdigit型
>>> '①'.isdecimal()
False
>>> '①'.isdigit()
True
>>> '①'.isnumeric()
True
特殊文字(漢数字)の場合
# 漢数字はnumeric型に属するようです
>>> '五'.isdecimal()
False
>>> '五'.isdigit()
False
>>> '五'.isnumeric()
True
特殊文字(例えば ‘⅕’:U+2155)の場合
# この特殊文字はnumeric型
>>> '⅕'.isdecimal()
False
>>> '⅕'.isdigit()
False
>>> '⅕'.isnumeric()
True
尚、どの文字がdecimalか、digitかは、こちらのサイト様が参考になります。
まとめ
今回は、文字列が数値かどうかを判別する方法についてまとめました。
- isdecimal():10進数字
- isdigit() :数字(10進数字+特殊数字)
- isnumeric():数 (数字+特殊数字)
コメント
[…] #参考、https://hibiki-press.tech/python/isdigit/899#toc2 […]