2721 Stimmen

Wie kann ich eine Zeichenkette in einen Float oder Int parsen?

  • Wie kann ich eine str a float ?

    "545.2222"    545.2222
  • Wie kann ich eine str a int ?

    "31"          31

19 Stimmen

Generell gilt: Wenn Sie ein Objekt in Python haben und es umwandeln wollen, müssen Sie zu diese Art von Objekt, rufen Sie type(my_object) darauf. Das Ergebnis kann normalerweise als Funktion aufgerufen werden, um die Konvertierung durchzuführen. Zum Beispiel type(100) führt zu int so können Sie anrufen int(my_object) zu versuchen, zu konvertieren my_object in eine ganze Zahl umgewandelt. Das funktioniert nicht immer, ist aber eine gute "erste Vermutung" beim Programmieren.

6 Stimmen

int(x) if int(x) == float(x) else float(x)

5 Stimmen

@tcpaiva ValueError: invalid literal for int() with base 10: '1.5' .

3062voto

Harley Holcombe Punkte 165146
>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

12 Stimmen

Ich frage mich nur, warum am Ende '04' steht? Warum nicht einfach '00'? Meine aktuelle Version von Python hat auch kein '04'.

76 Stimmen

@MangatRaiModi Fließkommazahlen sind von Natur aus unvollkommen für die Darstellung von Dezimalzahlen. Für mehr, siehe stackoverflow.com/q/21895756/931277

27 Stimmen

Warum nicht einfach int(a) pero int(float(a)) ?

597voto

Eric Leschinski Punkte 134271

Python-Methode zur Prüfung, ob eine Zeichenkette ein Float ist:

def is_float(value):
  try:
    float(value)
    return True
  except:
    return False

Ein längerer und genauerer Name für diese Funktion könnte lauten: is_convertible_to_float(value)

Was ist ein Float und was ist kein Float in Python kann Sie überraschen:

val                   is_float(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u''                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

Sie glauben, Sie wissen, was Zahlen sind? Du bist nicht so gut, wie du denkst! Keine große Überraschung.

Verwenden Sie diesen Code nicht für lebenswichtige Software!

Das Abfangen breiter Ausnahmen auf diese Weise, das Töten von Kanarienvögeln und das Verschlucken der Ausnahme schafft eine winzige Chance, dass ein gültiger Float als String false zurückgibt. Die float(...) Eine Codezeile kann aus tausend Gründen fehlschlagen, die nichts mit dem Inhalt der Zeichenkette zu tun haben. Wenn Sie aber lebenswichtige Software in einer Prototyp-Sprache wie Python schreiben, haben Sie viel größere Probleme.

1 Stimmen

Aus true wird also 1, das habe ich von C++ geerbt, denke ich.

9 Stimmen

Ich habe diese Antwort im Jahr 2014 veröffentlicht. Das UTF-8 Glyphe für eine chinesische 4 hat sich im Laufe der Jahre verändert, je nachdem, wie Stackoverflow-Entwickler ihr Zeichenkodierungsschema auf ihrem Microsoft-Toolstack ändern. Es ist eine Kuriosität zu sehen, wie es sich über die Jahre hin und her bewegt, wenn neue Konvertierungsschemata ihre neuen Ideologien durchsetzen. Aber ja, jede UTF-8 Glyphe für eine orientalische Zahl ist kein Python-Float. Bazinga.

9 Stimmen

Wie kann es sein, dass dies mit einer so weitreichenden Ausnahme so hoch bewertet wird?

579voto

Javier Punkte 58737
def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

90 Stimmen

implizit Das Mischen von Floats/Ints kann zu subtilen Fehlern führen, da die Präzision bei der Arbeit mit Floats möglicherweise verloren geht oder unterschiedliche Ergebnisse für / Operator für Floats/Ints. Je nach Kontext ist es vorzuziehen, entweder int oder float zurückzugeben, nicht beides.

15 Stimmen

@J.F.Sebastian Sie haben völlig recht, aber es gibt Zeiten, in denen man die Eingabe diktieren möchte, welche es sein wird. Die Eingabe diktieren zu lassen, kann gut mit Duck-Typing funktionieren.

9 Stimmen

Sie können eine weitere try eine Ausnahme auslösen, wenn es nicht in Float konvertierbar ist.

165voto

wim Punkte 297608

Dies ist eine weitere Methode, die es verdient, hier erwähnt zu werden, ast.literal_eval :

Dies kann verwendet werden, um Zeichenketten mit Python-Ausdrücken aus nicht vertrauenswürdigen Quellen sicher auszuwerten, ohne die Werte selbst parsen zu müssen.

Das heißt, ein sicheres 'eval'

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

16 Stimmen

Dies ist no eine gute Lösung für dieses Problem. Es funktioniert gut in Python 2, aber das Folgende passiert in Python 3: python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>> Um zu verdeutlichen, warum dies ein Problem ist: Wenn Sie möchten, dass das Programm Telefonnummern in Ruhe lässt und nicht davon ausgeht, dass es sich um mathematische Ausdrücke handelt, dann ist dieser Ansatz nichts für Sie.

6 Stimmen

@royce3 Ja, das ist ein guter Punkt, und die Nutzer sollten sich vorsehen. Das Verhalten wurde ursprünglich geändert, um einige Probleme beim Parsen von komplexen Literalen zu beheben. Es ist wohl ein Fehler in ast.literal_eval und wurde diskutiert ici .

5 Stimmen

@royce3 Für das Protokoll, ast wird in Python 3 die Telefonnummer nicht mehr wörtlich auf -2566 ausgewertet. Es ist in der Python 3.7 Änderungsprotokoll : _ast.literal_eval() ist jetzt strenger. Addition und Subtraktion beliebiger Zahlen sind nicht mehr erlaubt. (Beigesteuert von Serhiy Storchaka in bpo-31778 )_

87voto

Mark Chackerian Punkte 19075

Lokalisierung und Kommas

Sie sollten die Möglichkeit von Kommas in der Zeichenkettendarstellung einer Zahl in Betracht ziehen, für Fälle wie float("545,545.2222") was eine Ausnahme auslöst. Verwenden Sie stattdessen Methoden in locale um die Zeichenketten in Zahlen umzuwandeln und Kommas richtig zu interpretieren. Die locale.atof Methode konvertiert in einem Schritt in eine Fließkommazahl, sobald das Gebietsschema für die gewünschte Zahlenkonvention eingestellt wurde.

Beispiel 1 - Nummernkonventionen der Vereinigten Staaten

In den Vereinigten Staaten und im Vereinigten Königreich kann das Komma als Tausendertrennzeichen verwendet werden. In diesem Beispiel mit amerikanischem Gebietsschema wird das Komma ordnungsgemäß als Trennzeichen verwendet:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Beispiel 2 - Europäische Nummernkonventionen

In der Mehrheit der Länder der Welt Für Dezimalzeichen werden Kommas anstelle von Punkten verwendet. In diesem Beispiel mit französischem Gebietsschema wird das Komma korrekt als Dezimaltrennzeichen behandelt:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

Die Methode locale.atoi ist ebenfalls verfügbar, aber das Argument sollte eine ganze Zahl sein.

0 Stimmen

Dies scheint eine ideale Lösung zu sein, wenn man weiß, ob ein Float oder ein Int zurückgegeben werden soll, aber wie kann man dies dazu bringen, nur einen Int zurückzugeben, wenn ein Int übergeben wurde? Zum Beispiel, x = '1'; locale.atof(x) gibt zurück. 1.0 wenn ich eigentlich will 1 .

1 Stimmen

Wenn man Dinos Methode anwendet, wäre die Antwort wohl in etwa wie folgt: locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)

0 Stimmen

Ich würde empfehlen, die obige Methode von Javier zu verwenden (Wrapping locale.atoi in einem Versuch und mit locale.atof auf Ausnahme - das ist wahrscheinlich besser lesbar.

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