733 Stimmen

Wie kann ich überprüfen, ob eine Zeichenfolge eine int darstellt, ohne try/except zu verwenden?

Kann man irgendwie feststellen, ob ein String steht für eine ganze Zahl (z.B., '3' , '-17' aber nicht '3.14' o 'asfasfas' ) Ohne Verwendung eines try/except-Mechanismus?

is_int('3.14') == False
is_int('-7')   == True

28 Stimmen

Warum versuchen beide, dies "auf die harte Tour" zu tun? Was ist falsch an try/except?

8 Stimmen

Ja, was ist falsch an try/except? Es ist besser, um Vergebung zu bitten als um Erlaubnis.

82 Stimmen

Ich würde fragen, warum sollte diese einfache Sache try/except erfordern? Das Ausnahmesystem ist ein komplexes Biest, aber dies ist ein einfaches Problem.

1voto

krubo Punkte 4881

Wenn Sie nur Ziffern in Kleinbuchstaben akzeptieren möchten, finden Sie hier entsprechende Tests:

Python 3.7+: (u.isdecimal() and u.isascii())

Python <= 3.6: (u.isdecimal() and u == str(int(u)))

Andere Antworten empfehlen die Verwendung von .isdigit() ou .isdecimal() aber diese beide enthalten einige Zeichen des oberen Unicodes wie zum Beispiel '' ( u'\u0662' ):

u = u'\u0662'     # ''
u.isdigit()       # True
u.isdecimal()     # True
u.isascii()       # False (Python 3.7+ only)
u == str(int(u))  # False

1voto

agomcas Punkte 645

Ich habe eine Möglichkeit, die nicht int überhaupt verwenden, und sollte nicht eine Ausnahme auslösen, es sei denn, die Zeichenfolge nicht eine Zahl darstellen

float(number)==float(number)//1

Es sollte für jede Art von Zeichenkette funktionieren, die float akzeptiert, positiv, negativ, technische Notation...

1voto

Xenlyte Punkte 19

Meiner Meinung nach ist dies der einfachste und pythonischste Weg, um die Sache anzugehen. Ich habe diese Lösung nicht gesehen, und es ist im Grunde das gleiche wie die Regex ein, aber ohne die Regex.

def is_int(test):
    import string
    return not (set(test) - set(string.digits))

0voto

Jesko Hüttenhain Punkte 1152

Ich schlage Folgendes vor:

import ast

def is_int(s):
    return isinstance(ast.literal_eval(s), int)

Von der docs :

Sichere Auswertung eines Ausdrucksknotens oder einer Zeichenkette, die ein Python-Literal oder eine Containeranzeige enthält. Die angegebene Zeichenkette oder der Knoten darf nur aus den folgenden Python-Literalstrukturen bestehen: Strings, Bytes, Zahlen, Tupel, Listen, Dicts, Sets, Booleans und None.

Ich sollte anmerken, dass dies ein ValueError Ausnahme, wenn sie gegen etwas aufgerufen wird, das kein Python-Literal ist. Da in der Frage nach einer Lösung ohne try/except gefragt wurde, habe ich dafür eine Lösung vom Typ Kobayashi-Maru:

from ast import literal_eval
from contextlib import suppress

def is_int(s):
    with suppress(ValueError):
        return isinstance(literal_eval(s), int)
    return False

¯ \_ ()_/¯

0voto

Hmerman6006 Punkte 914

Cast Wert zu String nach der Prüfung ist Integer, dann prüfen String ersten Zeichen Wert ist - ou + und Rest der Zeichenfolge isdigit . Schließlich überprüfen Sie einfach isdigit .

test = ['1', '12015', '1..2', 'a2kk78', '1.5', 2, 1.24, '-8.5', '+88751.71', '-1', '+7']

Siehe

for k,v in enumerate(test): 
    print(k, v, 'test: ', True if isinstance(v, int) is not False else True if str(v)[0] in ['-', '+'] and str(v)[1:].isdigit() else str(v).isdigit())

Ergebnis

0 1 test:  True
1 12015 test:  True
2 1..2 test:  False
3 a2kk78 test:  False
4 1.5 test:  False
5 2 test:  True
6 1.24 test:  False
7 -8.5 test:  False
8 +88751.71 test:  False
9 -1 test:  True
10 +7 test:  True

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X