文字列の種別判定と数値変換

コマンドラインやrestのパラメータを始め、文字列でデータが渡される場合が多々あります。このページでは文字列が数値なのかどうかの判定と、数値への変換について学習します。

判定メソッド

文字列の半角判定

英数字の判定用にisalnumメソッド、英字判定用にisalphaメソッドがあります。ただし、なぜか全角文字の場合はTrueが返されてしまいます。utf-8に変換するとこの問題を解消することができます。

# 半角英数字 
print("1a".isalnum()) # True
print("1a".isalpha()) # False

# 半角英字
print("a".isalnum()) # True
print("a".isalpha()) # True 

# 半角記号 
print("!".isalnum()) # False 
print("!".isalpha()) # False 


# 全角
print("あ".isalnum()) # True
print("あ".isalpha()) # True 

# utf-8に変換
# 半角英数字 
print("1a".encode('utf-8').isalnum()) # True
print("1a".encode('utf-8').isalpha()) # False


# 半角英字
print("1".encode('utf-8').isalnum()) # True 
print("1".encode('utf-8').isalpha()) # False

# 半角記号
print("!".encode('utf-8').isalnum()) # False 
print("!".encode('utf-8').isalpha()) # False


# 全角文字
print("あ".encode('utf-8').isalnum()) # False 
print("あ".encode('utf-8').isalpha()) # False 


文字列の数字判定

strにはisdecimal()、isdigit()、isnumeric()の3つの数値判定メソッドが用意されていますが、取り扱う文字に依っては微妙に挙動が異なります。

また、小数点を含む文字はいずれも数値として判定されないため、注意が必要です。また符号付きの場合も数値とは判定されません。このため、数値への変換可否に使用することはおすすめしません。

# 半角数字
print("1".isdigit()) # True
print("1".isdecimal()) # True
print("1".isnumeric()) # True

# 半角数値(符号付き)
print("0.01".isdigit()) # False 
print("0.01".isdecimal()) # False 
print("0.01".isnumeric()) # False 
 
# 半角数値(小数)
print("0.01".isdigit()) # False 
print("0.01".isdecimal()) # False 
print("0.01".isnumeric()) # False 

# U+0660を含む場合
print("0٠01".isdigit()) # True 
print("0٠01".isdecimal()) # True 
print("0٠01".isnumeric()) # True 

# 全角数字
print("1".isdigit()) # True
print("1".isdecimal()) # True
print("1".isnumeric()) # True

# 全角漢数字
print("百".isdigit()) # False 
print("百".isdecimal()) #  False
print("百".isnumeric()) # True

# 全角ローマ数字
print("Ⅳ".isdigit()) # False 
print("Ⅳ".isdecimal()) # False 
print("Ⅳ".isnumeric()) # True

文字列の数字変換

整数に変換する場合は組込みのint関数を、小数に変換する場合は組込みのfloat関数を使用します。

# 整数
integer_str = "100"
integer_num = int(integer_str)
print(integer_num)

# 小数
decimal_str = "1.55"
decimal_num = float(decimal_str)
print(decimal_num)

また、数値に変換できない不正な文字列の場合はValueErrorが送出されます。

文字列の数字変換判定

前述のとおり、符号や小数点ではstrに実装されているメソッドでは判別できません。

自前で正規表現を使用しても良いのですが、厳密には符号と小数点以外に指数表記等も考慮する必要があります。

ですが、まず変換処理を行えば変換に失敗すればValueErrorが起きるため、これを利用すれば符号付きや指数表記にも対応して判定と変換を行うことができます。

def is_float_str(num_str, default=0):
    try:
        return {"is_float": True ,"val": float(num_str)}
    except ValueError:
        return {"is_float": False , "val": default}
        

print(is_float_str("1.5x")) # 変換に失敗{'is_float': False, 'val': 0}
print(is_float_str("-1.5")) # 変換に成功{'is_float': True, 'val': -1.5}
print(is_float_str("1E16")) # 変換に成功{'is_float': True, 'val': 1e+16}

上のサンプルでは文字列に対し、数値への変換可否と変換に成功した場合はその値を返しています。また、defaultを指定することで変換に失敗した場合のデフォルト値を設定することができます。