文字列が数値かどうか判定する方法
文字列の値の種類を調べる関数
文字列が数値かどうかはstrモジュールに付属する関数で調べることができる。ここでは、まずそれらの使い方について述べた後で、実用上の問題点について指摘する。
ざっと羅列すると、文字列がどんな値かを調べる関数には次のようなものがある。
文字列が十進数字か判定 | str.isdecimal() |
文字列が数字か判定 | str.isdigit() |
文字列が数を表す文字か判定 | str.isnumeric() |
文字列が英字か判定 | str.isalpha() |
文字列が英数字か判定 | str.isalnum() |
文字列がASCII文字か判定 | str.isascii() |
試しに使ってみると次のようになる。
for s in ["0", "-5", "3.14", "apple"]: if str.isdecimal(s): print(s + " は十進数字です。") else: print(s + " は十進数字ではありません。") # 0 は十進数字です。 # -5 は十進数字ではありません。 # 3.14 は十進数字ではありません。 # apple は十進数字ではありません。 for s in ["0", "-5", "3.14", "apple"]: if str.isdigit(s): print(s + " は非負整数です。") else: print(s + " は非負整数ではありません。") # 0 は非負整数です。 # -5 は非負整数ではありません。 # 3.14 は非負整数ではありません。 # apple は非負整数ではありません。 for s in ["0", "-5", "3.14", "apple"]: if str.isnumeric(s): print(s + " は数です。") else: print(s + " は数ではありません。") # 0 は数です。 # -5 は数ではありません。 # 3.14 は数ではありません。 # apple は数ではありません。
結果を見ると、isdecimal、isdigit、isnumericではいずれも非負整数のみ “True” を返し、それ以外のタイプの文字列についてはうまく判別できていない印象を受ける。実際、これらの関数ではマイナスなどの特殊記号を含む引数が数値として判定されないという欠点がある。
これを克服するためには適当な関数を自作しなければならない。次にこの対処方法について説明する。
文字列がどんな数値か判定する方法
上記の目的を達成するにはPythonの 例外処理 を用いて関数を作る必要がある。例えば以下のように実装可能である。
def isint(s): # 整数値かどうかを判定する関数 try: int(s, 10) # 試しにint関数で文字列を変換 except ValueError: return False # 失敗すれば False else: return True # 上手くいけば True for s in ["0", "-5", "3.14", "apple"]: if isint(s): print(s + " は整数です。") else: print(s + " は整数ではありません。") # 0 は整数です。 # -5 は整数です。 # 3.14 は整数ではありません。 # apple は整数ではありません。
浮動小数点数型(float型)かどうか判定したい場合は次のようにする。
def isfloat(s): # 浮動小数点数値かどうかを判定する関数 try: float(s) # 試しにfloat関数で文字列を変換 except ValueError: return False # 失敗すれば False else: return True # 上手くいけば True for s in ["0", "-5", "3.14", "apple"]: if isfloat(s): print(s + " は浮動小数点数です。") else: print(s + " は浮動小数点数ではありません。") # 0 は浮動小数点数です。 # -5 は浮動小数点数です。 # 3.14 は浮動小数点数です。 # apple は浮動小数点数ではありません。
単純に(整数ではなく)小数かどうかを判定したい時は上で自作したisint関数とisfloat関数を組み合わせれば良い。
def isint(s): # 整数値かどうかを判定する関数 try: int(s, 10) # 試しにint関数で文字列を変換 except ValueError: return False # 失敗すれば False else: return True # 上手くいけば True def isfloat(s): # 浮動小数点数値かどうかを判定する関数 try: float(s) # 試しにfloat関数で文字列を変換 except ValueError: return False # 失敗すれば False else: return True # 上手くいけば True for s in ["0", "-5", "3.14", "apple"]: if isfloat(s) and not isint(s): print(s + " は小数です。") else: print(s + " は小数ではありません。") # 0 は小数ではありません。 # -5 は小数ではありません。 # 3.14 は小数です。 # apple は小数ではありません。
これらの方法は文字列に半角スペースやタブ文字が入っていても機能するので便利である。また、この方法では「1e+2」などの指数表記された文字列が浮動小数点数型と判定されるので注意。