Wie kann ich eine Zeichenfolge mit Punkt und Komma in Python in ein Float konvertieren?

92

Wie kann ich einen String konvertieren, der gerne in Python 123,456.908schwebt 123456.908?

Kevinlu
quelle
11
Der richtige Weg, dies zu tun, ist die Verwendung des localeModuls - alles andere ist nur ein sehr böser Hack, der Sie in Zukunft in Schwierigkeiten bringen wird.
Nick Bastin

Antworten:

132

Entfernen Sie einfach das ,mit replace():

float("123,456.908".replace(',',''))
Zeekay
quelle
15
Dies hängt vom Gebietsschema ab. 9 988 776,65 € in Frankreich 9.988.776,65 € in Deutschland 9.988.776,65 € in den Vereinigten Staaten
Alexandru R
Wenn Sie Konstanten in den Quellcode schreiben und Kommas verwenden möchten, um die Lesbarkeit zu verbessern, ist dies der richtige Weg und nicht das Gebietsschema, wodurch der Code an einem anderen Ort fehlschlägt. python cd_size = float("737,280,000".replace(',','')) (Ich habe tatsächlich int verwendet)
hum3
Wenn Sie eine String-Literal-Konstante in den Quellcode schreiben und diese dann explizit in Integer oder Float konvertieren, ist dies ein Zeichen dafür, dass etwas mit dem Design nicht stimmt. Aber selbst wenn es verteidigt werden kann, setzen Sie das Gebietsschema für diesen Kontext nur vorübergehend auf das Gebietsschema, in das der Code geschrieben wurde, und stellen Sie dann den für Ihre Benutzer geeigneten Kontext wieder her, wenn Sie Benutzereingaben verarbeiten. Deshalb gibt es setlocalein erster Linie.
Karl Knechtel
Tun Sie dies nicht, es erlaubt Dinge wie "123
,,,,
151

... Oder anstatt die Kommas als herauszufilternden Müll zu behandeln, könnten wir die Gesamtzeichenfolge als lokalisierte Formatierung des Floats behandeln und die Lokalisierungsdienste verwenden:

from locale import atof, setlocale, LC_NUMERIC
setlocale(LC_NUMERIC, '') # set to your default locale; for me this is
# 'English_Canada.1252'. Or you could explicitly specify a locale in which floats
# are formatted the way that you describe, if that's not how your locale works :)
atof('123,456') # 123456.0
# To demonstrate, let's explicitly try a locale in which the comma is a
# decimal point:
setlocale(LC_NUMERIC, 'French_Canada.1252')
atof('123,456') # 123.456
Karl Knechtel
quelle
3
Bisher pythonischste und intuitivste Art und Weise. +1
Aufwind
2
Ich würde diese Antwort
verbessern,
14
Extension modules should never call setlocale()
Gut
12
@wanderer: Was veraltet ist, ist die atof eingebaute Methode von Strings . Was ich hier benutze, ist die Funktion atofaus dem localeStandardbibliotheksmodul, die überhaupt nicht veraltet ist.
Karl Knechtel
5
Das ist der Grund, warum Sternimporte schlecht sind - ich würde vorschlagen, dass Sie dies bearbeiten, um entweder das zu importieren, was benötigt wird, oder einen besseren Namespace wie inlocale.atof
Mr_and_Mrs_D
7

Wenn Sie das Gebietsschema nicht kennen und eine beliebige Zahl analysieren möchten, verwenden Sie diese parseNumber(text)Funktion . Es ist nicht perfekt, berücksichtigt aber die meisten Fälle:

>>> parseNumber("a 125,00 €")
125
>>> parseNumber("100.000,000")
100000
>>> parseNumber("100 000,000")
100000
>>> parseNumber("100,000,000")
100000000
>>> parseNumber("100 000 000")
100000000
>>> parseNumber("100.001 001")
100.001
>>> parseNumber("$.3")
0.3
>>> parseNumber(".003")
0.003
>>> parseNumber(".003 55")
0.003
>>> parseNumber("3 005")
3005
>>> parseNumber("1.190,00 €")
1190
>>> parseNumber("1190,00 €")
1190
>>> parseNumber("1,190.00 €")
1190
>>> parseNumber("$1190.00")
1190
>>> parseNumber("$1 190.99")
1190.99
>>> parseNumber("1 000 000.3")
1000000.3
>>> parseNumber("1 0002,1.2")
10002.1
>>> parseNumber("")

>>> parseNumber(None)

>>> parseNumber(1)
1
>>> parseNumber(1.1)
1.1
>>> parseNumber("rrr1,.2o")
1
>>> parseNumber("rrr ,.o")

>>> parseNumber("rrr1rrr")
1
hayj
quelle
7

Wenn Sie ein Komma als Dezimaltrennzeichen und den Punkt als Tausendertrennzeichen haben, können Sie Folgendes tun:

s = s.replace('.','').replace(',','.')
number = float(s)

Hoffe es wird helfen

Luca Di Liello
quelle
6

Was ist damit?

 my_string = "123,456.908"
 commas_removed = my_string.replace(',', '') # remove comma separation
 my_float = float(commas_removed) # turn from string to float.

Zusamenfassend:

my_float = float(my_string.replace(',', ''))
Aufwind
quelle
2
s =  "123,456.908"
print float(s.replace(',', ''))
Andreas Jung
quelle
2
doppelte Antwort.
Philippe Remy
2

Hier ist eine einfache Möglichkeit, die ich für Sie geschrieben habe. :) :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908
John Doe
quelle
reist ein großer Hammer für eine solche Aufgabe.
Roman Bodnarchuk
@ John Doe: Sieht jetzt viel besser aus. Ich mag float(number)wegen seiner beschreibenden Note. +1 ;-)
Aufwind
2
9 988 776,65 € in Frankreich 9.988.776,65 € in Deutschland 9.988.776,65 € in den USA ----> Sind Sie sicher, dass es funktioniert?
Alexandru R
1

Einfach durch ,replace () ersetzen.

f = float("123,456.908".replace(',','')) print(type(f)

type () zeigt Ihnen, dass es in einen float konvertiert wurde

Vibhor Karnawat
quelle
1

Bessere Lösung für verschiedene Währungsformate :

def text_currency_to_float(text):
  t = text
  dot_pos = t.rfind('.')
  comma_pos = t.rfind(',')
  if comma_pos > dot_pos:
    t = t.replace(".", "")
    t = t.replace(",", ".")
  else:
    t = t.replace(",", "")

  return(float(t))
Quincy Hsieh
quelle