2013-05-31 11 views
8

文字列が数値かどうかをisnumeric関数で確認しますが、結果は期待通りではありません。関数はUnicode文字列の場合にのみ機能します。Python isnumeric関数はユニコードでしか機能しません

>>> a=u'1' 
>>> a.isnumeric() 
True 
>>> a='1' 
>>> a.isnumeric() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'str' object has no attribute 'isnumeric' 

isnumericはユニコードが動作している場合のみ動作します。

答えて

5

多くの場合、Pythonの文字列が数字であるかどうかをチェックしたいと思うことがあります。この は、ユーザー入力、 データベース(文字列を返す可能性があります)からデータを取得すること、または 番号を含むファイルを読み取るなど、常に発生します。あなたが期待している番号のタイプに応じて、 はいくつかの方法を使用できます。正規表現を使用して文字列を解析するか、 を数字にキャスト(変換)しようとしていて、何が起こっているのかを確認するなどです。 多くの場合、 ユニコードでエンコードされたASCII以外の数字が表示されることがあります。これらは数字であってもなくてもよい。たとえば2の場合は、 タイでは2です。しかし、©は単に著作権シンボルであり、明らかに ではありません。

リンク:http://pythoncentral.io/how-to-check-if-a-string-is-a-number-in-python-including-unicode/

12

ちょうど別の名前です。

「1'.isdigit()

+0

文字列 'a'にもfloat値を含めることができるので、isdigitは使用できません.. – user1050619

+2

u'1.5'.isnumeric()= False、isdigitを使用するか、独自の関数を記述してください。 –

4

Python documentationによれば、isnumericは、Unicodeオブジェクトに対してのみ存在している:

以下の方法のみユニコードオブジェクト上に存在しますunicode.isnumeric()

Sに数字だけがある場合はTrueを返し、それ以外の場合はFalseを返します。数字には数字の文字、Unicodeの数値プロパティを持つすべての文字が含まれます。 U + 2155、バルグルフラクション1回。

1

isnumeric()は、Unicode文字列に異なるnumeral systemsのサポートを拡張しました。

アメリカおよびヨーロッパでは数字で構成されるHindu-Arabic numeral systemが使用されます。

ヒンドゥーアラビア数字は、Unicodeによってヨーロッパ数字とも呼ばれます。

ザのような利用可能な他の符号系である:

  • ローマ数字
  • 古代ギリシアの数字
  • タミル数字
  • Japaneese数字
  • Chineese数字
  • 韓国数字
数字システムについて

詳しい情報はここで見つけることができます:wikiwand.com/en/Numerals_in_Unicode#/Numerals_by_script

ユニコードsubscriptsuperscriptfractionsisnumeric()機能によって有効な数字と考えられています。


以下のisnumeric()関数を使用して、文字列が非ユニコード番号であるかどうかを確認できます。

l = ['abc' + chr(255), 'abc', '123', '45a6', '78b', u"\u2155", '123.4', u'\u2161', u'\u2168'] 

def isnumeric(s): 
    '''Returns True for all non-unicode numbers''' 
    try: 
     s = s.decode('utf-8') 
    except: 
     return False 

    try: 
     float(s) 
     return True 
    except: 
     return False 


for i in l: 
    print i, 'isnumeric:', isnumeric(i) 

print '--------------------' 
print u'\u2169', 'isnumeric', u'\u2169'.isnumeric() 
print u'\u2165', 'isnumeric', u'\u2165'.isnumeric() 

編集:私はできるだけ早く私はこの答えに2つの以上のリンクを追加するのに十分な評判を持っているように、この記事を更新します。

関連する問題