-
Wie kann ich eine
str
afloat
?"545.2222" 545.2222
-
Wie kann ich eine
str
aint
?"31" 31
Ich frage mich nur, warum am Ende '04' steht? Warum nicht einfach '00'? Meine aktuelle Version von Python hat auch kein '04'.
Wie kann ich eine str
a float
?
"545.2222" 545.2222
Wie kann ich eine str
a int
?
"31" 31
Ich frage mich nur, warum am Ende '04' steht? Warum nicht einfach '00'? Meine aktuelle Version von Python hat auch kein '04'.
@MangatRaiModi Fließkommazahlen sind von Natur aus unvollkommen für die Darstellung von Dezimalzahlen. Für mehr, siehe stackoverflow.com/q/21895756/931277
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)
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.
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.
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.
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.
@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.
Sie können eine weitere try
eine Ausnahme auslösen, wenn es nicht in Float konvertierbar ist.
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
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.
@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 .
@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 )_
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.
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
.
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)
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 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.
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 Beispieltype(100)
führt zuint
so können Sie anrufenint(my_object)
zu versuchen, zu konvertierenmy_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'
.0 Stimmen
Int(x) if int(float(x)) == float(x) else float(x)