2013-05-31 5 views
8

Ich versuche zu überprüfen, ob eine Zeichenfolge numerisch ist oder nicht mit der Isnumeric-Funktion, aber die Ergebnisse sind nicht wie erwartet.Die Funktion funktioniert nur, wenn es eine Unicode-Zeichenfolge ist.Python isnumeric Funktion funktioniert nur auf Unicode

>>> 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 funktioniert nur, wenn seine Unicode..Any Grund?

Antwort

5

Oft werden Sie wollen, wenn eine Zeichenfolge in Python zu überprüfen, eine Zahl ist. Diese passiert die ganze Zeit, zum Beispiel mit Benutzereingaben, Abrufen von Daten aus einer Datenbank (die eine Zeichenfolge zurückgeben kann) oder Lesen einer Datei mit Zahlen. Abhängig davon, welche Art von Nummer Sie erwarten, können Sie mehrere Methoden verwenden. Wie zum Beispiel die Zeichenfolge zu analysieren, mit Regex, oder einfach versucht, es in eine Zahl zu werfen und zu sehen, was passiert. Oft werden Sie auch Nicht-ASCII-Nummern finden, die in Unicode codiert sind. Dies können Zahlen sein oder auch nicht. Zum Beispiel 2, das ist 2 in Thai. Jedoch © ist einfach das Copyright-Symbol und ist natürlich keine Nummer.

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

12

Nur anderer Name.

‚1'.isdigit() Wahr

+0

String 'a' kann float-Werte enthalten, daher kann ich isdigit nicht verwenden. – user1050619

+2

u'1.5'.isnumeric() = False, benutze isdigit oder schreibe deine eigene Funktion. –

4

Nach der Python documentation ist isnumeric nur vorhanden, für Unicode-Objekte:

Die folgenden Verfahren nur auf Unicode Objekte vorhanden sind:

unicode.isnumeric()

Rückgabe True, wenn nur numerische Zeichen in S vorhanden sind, andernfalls False. Numerische Zeichen umfassen Ziffernzeichen und alle Zeichen, die die Unicode-Zahlenwerteigenschaft aufweisen, z. U + 2155, VULGAR FRACTION EINE FÜNFTE.

1

isnumeric() Unterstützung für verschiedene numeral systems in Unicode-Strings erweitert. In Amerika und Europa wird Hindu-Arabic numeral system verwendet, die ausZiffern besteht.

Die Hindu-arabischen Ziffern werden vom Unicode auch als europäische Ziffern bezeichnet.

Das sind andere Zahlensysteme zur Verfügung, wie:

  • römischen Ziffern
  • Altgriechisch Ziffern
  • Tamil Ziffern
  • Japaneese Ziffern
  • Chineese Ziffern
  • koreanischen Ziffern

Mehr Informationen über Zahlensysteme sind hier zu finden: wikiwand.com/en/Numerals_in_Unicode#/Numerals_by_script

Unicode subscript, superscript und fractions sind auch gültig Ziffern durch die isnumeric() Funktion betrachtet.


Sie können die IsNumeric() Funktion unten, um zu überprüfen, ob eine Zeichenfolge eine Nicht-Unicode-Nummer ist.

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() 

Edit: Ich werde diesen Beitrag aktualisieren, sobald ich genug Ruf haben mehr als 2 Links zu dieser Antwort hinzuzufügen.