Wie kann ich in Python eine numerische Zeichenfolge "545.2222"
auf den entsprechenden Gleitkommawert analysieren 545.2222
? Oder analysieren Sie die Zeichenfolge "31"
auf eine Ganzzahl 31
?
Ich möchte nur wissen, wie man einen Float str
zu einem float
und (separat) einen Int str
zu einem analysiert int
.
python
parsing
floating-point
type-conversion
integer
Tristan Havelick
quelle
quelle
type(my_object)
auf. Das Ergebnis kann normalerweise als Funktion für die Konvertierung aufgerufen werden. Diestype(100)
führt beispielsweise zuint
, sodass Sie aufrufen können, umint(my_object)
zu versuchen,my_object
in eine Ganzzahl zu konvertieren . Dies funktioniert nicht immer, ist aber eine gute "erste Vermutung" beim Codieren.int(x) if int(x) == float(x) else float(x)
Antworten:
quelle
int(a)
aberint(float(a))
?int(a)
gibt den Fehler aus, dass die Zeichenfolge keine gültige Ganzzahl ist: DieValueError: invalid literal for int() with base 10: '545.222'
Konvertierung von einem Float in ein Int wird jedoch unterstützt.ValueError
wenn Sie sicher sein wollenquelle
/
Bediener von Floats / Ints. Je nach Kontext ist es möglicherweise vorzuziehen, entweder int oder float zurückzugeben, nicht beide.try
, um eine Ausnahme auszulösen, wenn sie nicht in float konvertierbar ist.s = u'\u0000'
ValueError
das entsprechendeexcept
: PPython-Methode, um zu überprüfen, ob ein String ein Float ist:
Ein längerer und genauerer Name für diese Funktion könnte sein:
is_convertible_to_float(value)
Was in Python ist und was nicht, kann Sie überraschen:
Sie glauben zu 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!
Wenn Sie auf diese Weise breite Ausnahmen abfangen, Kanarienvögel töten und die Ausnahme verschlingen, besteht eine geringe Wahrscheinlichkeit, dass ein gültiger Float als String false zurückgibt. Die
float(...)
Codezeile kann aus tausend Gründen fehlschlagen, die nichts mit dem Inhalt der Zeichenfolge zu tun haben. Wenn Sie jedoch lebenswichtige Software in einer Prototypensprache wie Python schreiben, haben Sie viel größere Probleme.quelle
UTF-8
Glyphe für einen Chinesen4
hat sich im Laufe der Jahre verändert, je nachdem, wie Stackoverflow-Entwickler ihr Zeichencodierungsschema auf ihrem Microsoft-Toolstack ändern. Es ist eine Kuriosität zu sehen, wie es im Laufe der Jahre umkippt, wenn neue Konversionsschemata ihre neuen Ideologien durchsetzen. Aber ja, jedeUTF-8
Glyphe für eine östliche orientalische Zahl ist kein Python-Float. Bazinga."- 12.3"
und"45 e6"
TypeError, ValueError
Dies ist eine weitere Methode, die es verdient, hier erwähnt zu werden: ast.literal_eval :
Das heißt, eine sichere "Bewertung"
quelle
python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>
Um zu verdeutlichen, warum dies ein Problem ist, ist dieser Ansatz nichts für Sie, wenn Sie möchten, dass Telefonnummern in Ruhe gelassen werden und nicht davon ausgegangen wird, dass es sich um mathematische Ausdrücke handelt.ast.literal_eval
und wird diskutiert hier .quelle
float("nan")
ist ein vollkommen gültiger Float-Wert, den die obige Antwort überhaupt nicht fangen würde192.168.0.1
; oder"This is not a good approach. :)"
Lokalisierung und Kommas
Sie sollten die Möglichkeit von Kommas in der Zeichenfolgendarstellung einer Zahl in Betracht ziehen, wenn solche Fälle
float("545,545.2222")
eine Ausnahme auslösen. Verwenden Sie stattdessen Methoden inlocale
, um die Zeichenfolgen in Zahlen umzuwandeln und Kommas korrekt zu interpretieren. Dielocale.atof
Methode wird in einem Schritt in einen Float konvertiert, sobald das Gebietsschema für die gewünschte Nummernkonvention festgelegt wurde.Beispiel 1 - US-Nummernkonventionen
In den USA und Großbritannien können Kommas als Tausendertrennzeichen verwendet werden. In diesem Beispiel mit amerikanischem Gebietsschema wird das Komma ordnungsgemäß als Trennzeichen behandelt:
Beispiel 2 - Europäische Nummernkonventionen
In den meisten Ländern der Welt werden Kommas anstelle von Punkten für Dezimalstellen verwendet. In diesem Beispiel mit französischem Gebietsschema wird das Komma korrekt als Dezimalzeichen behandelt:
Die Methode
locale.atoi
ist ebenfalls verfügbar, das Argument sollte jedoch eine Ganzzahl sein.quelle
x = '1'; locale.atof(x)
kehrt zurück,1.0
wenn ich tatsächlich will1
.locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
locale.atoi
in einen Versuch einwickeln undlocale.atof
ausnahmsweise verwenden - es ist wahrscheinlich besser lesbar.Wenn Sie Modulen von Drittanbietern nicht abgeneigt sind, können Sie sich das Fastnumbers- Modul ansehen . Es bietet eine Funktion namens fast_real , die genau das tut, was diese Frage verlangt, und das schneller als eine reine Python-Implementierung:
quelle
Benutzer codelogic und harley sind korrekt, aber denken Sie daran, wenn Sie wissen, dass die Zeichenfolge eine Ganzzahl ist (z. B. 545), können Sie int ("545") aufrufen, ohne zuerst in float umzuwandeln.
Wenn sich Ihre Zeichenfolgen in einer Liste befinden, können Sie auch die Kartenfunktion verwenden.
Es ist nur gut, wenn sie alle vom gleichen Typ sind.
quelle
Es ist gut, dass Sie darum bitten, dies separat zu tun. Wenn Sie sie mischen, können Sie sich später auf Probleme einstellen. Die einfache Antwort lautet:
"545.2222"
schweben:"31"
zu einer ganzen Zahl:Andere Konvertierungen, Ints zu und von Strings und Literalen:
Konvertierungen von verschiedenen Basen, und Sie sollten die Basis im Voraus kennen (10 ist die Standardeinstellung). Beachten Sie, dass Sie ihnen das voranstellen können, was Python für seine Literale erwartet (siehe unten), oder das Präfix entfernen können:
Wenn Sie die Basis nicht im Voraus kennen, aber wissen, dass sie das richtige Präfix haben, kann Python dies für Sie ableiten, wenn Sie
0
als Basis übergeben:Nicht dezimale (dh ganzzahlige) Literale aus anderen Basen
Wenn Ihre Motivation darin besteht, dass Ihr eigener Code eindeutig fest codierte spezifische Werte darstellt, müssen Sie möglicherweise nicht von den Basen konvertieren - Sie können Python dies automatisch mit der richtigen Syntax für Sie tun lassen.
Sie können die Präfixe apropos verwenden, um eine automatische Konvertierung in Ganzzahlen mit zu erhalten den folgenden Literalen zu erhalten . Diese gelten für Python 2 und 3:
Binär, Präfix
0b
Oktal, Präfix
0o
Hexadezimal, Präfix
0x
Dies kann nützlich sein, wenn Sie Binärflags, Dateiberechtigungen im Code oder Hex-Werte für Farben beschreiben. Beachten Sie beispielsweise keine Anführungszeichen:
Mehrdeutige Python 2-Oktale mit Python 3 kompatibel machen
Wenn Sie in Python 2 eine Ganzzahl sehen, die mit einer 0 beginnt, ist dies eine (veraltete) Oktalsyntax.
Es ist schlecht, weil es so aussieht, als ob der Wert sein sollte
37
. In Python 3 wird nun Folgendes ausgelöstSyntaxError
:Konvertieren Sie Ihre Python 2-Oktale in Oktale, die sowohl in 2 als auch in 3 funktionieren, mit dem
0o
Präfix:quelle
Die Frage scheint ein bisschen alt zu sein. Aber lassen Sie mich eine Funktion vorschlagen, parseStr, die etwas Ähnliches macht, dh Integer oder Float zurückgibt, und wenn eine bestimmte ASCII-Zeichenfolge nicht in keine von ihnen konvertiert werden kann, gibt sie sie unberührt zurück. Der Code kann natürlich so angepasst werden, dass er nur das tut, was Sie wollen:
quelle
1e3
ist eine Zahl in Python, aber eine Zeichenfolge gemäß Ihrem Code.float("545.2222")
undint(float("545.2222"))
quelle
Ich benutze diese Funktion dafür
Der String wird in seinen Typ konvertiert
quelle
parse_str(' 1')
(mit einem Leerzeichen)None
nicht zurückgegeben wird1
.Mit dem YAML- Parser können Sie herausfinden, welcher Datentyp Ihre Zeichenfolge ist. Verwenden Sie
yaml.load()
, und dann können Sie verwendentype(result)
, um auf Typ zu testen:quelle
quelle
except
Sektion erhöhen, wenn Sie dort nichts tun? float () würde für Sie erhöhen.int
oderfloat
abhängig von der Darstellung der Zeichenfolge zurückzugeben. Es kann zu Parsing-Ausnahmen kommen oder [ein unerwartetes Verhalten haben] [1].quelle
Sie müssen die Rundung berücksichtigen, um dies richtig zu tun.
Dh int (5.1) => 5 int (5.6) => 5 - falsch, sollte 6 sein, also machen wir int (5.6 + 0.5) => 6
quelle
int
undfloat
. Und es wird eine Ausnahme geben, wennn
es sich um eine Zeichenfolge handelt, wie es OP wünscht. Vielleicht meinten Sie: Wenn einint
Ergebnis gewünscht wird,round
sollte nach der Konvertierung in Float erfolgen. Wenn die Funktion IMMER ein int zurückgeben soll, benötigen Sie nicht den Ausnahmeteil - der gesamte Funktionskörper kann seinint(round(float(input)))
. Wenn die Funktion nach Möglichkeit ein int zurückgeben sollte, andernfalls ein float, dann ist Javiers ursprüngliche Lösung korrekt!Ich bin überrascht, dass niemand Regex erwähnt hat, da manchmal eine Saite vorbereitet und normalisiert werden muss, bevor sie zur Nummer geworfen wird
Verwendungszweck:
und übrigens etwas, um zu überprüfen, ob Sie eine Nummer haben:
quelle
Verwenden Sie zum Typisieren in Python die Konstruktorfunktionen des Typs und übergeben Sie die Zeichenfolge (oder den Wert, den Sie umwandeln möchten) als Parameter.
Zum Beispiel:
Hinter den Kulissen ruft Python die Objektmethode auf
__float__
, die eine Float-Darstellung des Parameters zurückgeben soll. Dies ist besonders leistungsfähig, da Sie Ihre eigenen Typen (mithilfe von Klassen) mit einer__float__
Methode definieren können, damit sie mit float (myobject) in einen float umgewandelt werden können.quelle
Dies ist eine korrigierte Version von https://stackoverflow.com/a/33017514/5973334
Dadurch wird versucht, eine Zeichenfolge zu analysieren und entweder
int
oderfloat
abhängig von der Darstellung der Zeichenfolge zurückzugeben. Es kann zu Parsing-Ausnahmen kommen oder zu unerwartetem Verhalten .quelle
Übergeben Sie Ihren String an diese Funktion:
Es wird int, float oder string zurückgeben, je nachdem, was übergeben wurde.
Zeichenfolge, die ein int ist
String, der ein Float ist
Zeichenfolge, die eine Zeichenfolge ist
Zeichenfolge, die wie ein Schwimmer aussieht
quelle
Verwenden:
Dies ist der pythonischste Weg, den ich finden konnte.
quelle
float
. Dertry
…catch
Block sollte sich wahrscheinlich innerhalb derfor
Schleife befinden.Behandelt Hex, Oktal, Binär, Dezimal und Float
Diese Lösung behandelt alle Zeichenfolgenkonventionen für Zahlen (alles, was ich weiß).
Diese Testfallausgabe zeigt, wovon ich spreche.
Hier ist der Test:
quelle
Verwenden:
quelle
Dies ist eine Funktion, die eine beliebige
object
(nicht nurstr
) inint
oder konvertiertfloat
, je nachdem, ob die tatsächlich angegebene Zeichenfolge wieint
oder aussiehtfloat
. Wenn es sich um ein Objekt handelt, das sowohl__float
als auch__int__
Methoden enthält, wird standardmäßig verwendet__float__
quelle
Mit den Methoden int und float können wir einen String in Integer und Floats konvertieren.
quelle
eval()
ist eine sehr gute Lösung für diese Frage. Es muss nicht überprüft werden, ob die Zahl int oder float ist, sondern es wird nur das entsprechende Äquivalent angegeben. Wenn andere Methoden erforderlich sind, versuchen Sie esAls Alternative kann auch try-without verwendet werden. Versuchen Sie, den String innerhalb des try-Blocks in int zu konvertieren. Wenn die Zeichenfolge ein Gleitkommawert wäre, wird ein Fehler ausgegeben, der wie folgt im Ausnahmeblock abgefangen wird
quelle
Hier ist eine andere Interpretation Ihrer Frage (Hinweis: Es ist vage). Möglicherweise suchen Sie so etwas:
Es funktioniert so ...
Theoretisch gibt es eine Anfälligkeit für Injektionen. Die Zeichenfolge könnte zum Beispiel sein
"import os; os.abort()"
. Ohne Hintergrundinformationen darüber, woher die Zeichenfolge stammt, besteht jedoch die Möglichkeit theoretischer Spekulation. Da die Frage vage ist, ist überhaupt nicht klar, ob diese Sicherheitsanfälligkeit tatsächlich besteht oder nicht.quelle
eval()
ist sie mehr als dreimal so langsam wietry: int(s) except: float(s)
.eval
ist schlechte Praxis (Sie müssen wissen, weil Sie 310k Ruf haben)