Jak mogę zamienić ciąg z kropką i przecinkiem na liczbę zmiennoprzecinkową w Pythonie

86

Jak mogę przekonwertować ciąg, taki jak 123,456.908float 123456.908w Pythonie?

kevinlu
źródło
9
Właściwym sposobem na to jest użycie localemodułu - wszystko inne to tylko bardzo paskudny hack, który wpędzi cię w kłopoty w przyszłości.
Nick Bastin,

Odpowiedzi:

129

Po prostu usuń za ,pomocą replace():

float("123,456.908".replace(',',''))
zeekay
źródło
14
zależy to od lokalizacji. 9 988 776,65 € we Francji 9 988 776,65 € w Niemczech 9 988 776,65 USD w Stanach Zjednoczonych
Alexandru R
Jeśli piszesz stałe w kodzie źródłowym i chcesz użyć przecinków, aby uczynić go bardziej czytelnym, to jest to droga zamiast ustawień regionalnych, które spowodowałyby awarię kodu w innym miejscu. python cd_size = float("737,280,000".replace(',','')) (Właściwie użyłem int)
hum3
Jeśli piszesz w kodzie źródłowym stałą literału ciągu, a następnie jawnie konwertujesz ją na liczbę całkowitą lub zmiennoprzecinkową, oznacza to, że wystąpił problem z projektem. Ale nawet jeśli można go chronić - po prostu tymczasowo ustaw ustawienia regionalne na to, w którym kod jest napisany, dla tego kontekstu, a następnie przywróć kontekst odpowiedni dla użytkowników podczas obsługi danych wejściowych użytkownika. Dlatego jest setlocalena pierwszym miejscu.
Karl Knechtel,
nie rób tego, zezwala na takie rzeczy jak „123 ,,,, 345”
amohr,
148

... Lub zamiast traktować przecinki jako śmieci do odfiltrowania, moglibyśmy traktować cały ciąg jako zlokalizowane formatowanie zmiennej zmiennoprzecinkowej i używać usług lokalizacyjnych:

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
źródło
3
Jak dotąd najbardziej pythonowy i intuicyjny sposób. +1
Aufwind
2
Głosowałbym w górę na tę odpowiedź, gdyby przykłady zawierały zarówno kropkę dziesiętną, jak i znaki grupujące cyfry ...
martineau
14
Dobra jak na skrypt, zły dla biblioteki:Extension modules should never call setlocale()
blueFast
12
@wanderer: to, co jest przestarzałe, to atof wbudowana metoda ciągów . Używam tutaj funkcji atofze localestandardowego modułu biblioteki, która wcale nie jest przestarzała.
Karl Knechtel,
5
Dlatego importowanie gwiazd jest złe - sugerowałbym edycję tego, aby zaimportować to, co jest potrzebne, lub lepszą przestrzeń nazw, jak wlocale.atof
Mr_and_Mrs_D
6

A co z tym?

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

W skrócie:

my_float = float(my_string.replace(',', ''))
Aufwind
źródło
6

Jeśli masz przecinek jako separator miejsc dziesiętnych, a kropkę jako separator tysięcy, możesz:

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

Mam nadzieję, że to pomoże

Luca Di Liello
źródło
5

Jeśli nie znasz ustawień regionalnych i chcesz przeanalizować dowolną liczbę, użyj tej parseNumber(text)funkcji . Nie jest doskonały, ale weź pod uwagę większość przypadków:

>>> 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
źródło
2
s =  "123,456.908"
print float(s.replace(',', ''))
Andreas Jung
źródło
2
zduplikowana odpowiedź.
Philippe Remy
2

Oto prosty sposób, w jaki napisałem dla Ciebie. :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908
nieznany z nazwiska
źródło
reto duży młot do takiego zadania.
Roman Bodnarchuk
@John Doe: Teraz wygląda o wiele lepiej. Lubię float(number)ze względu na opisowy dotyk. +1 ;-)
Aufwind
2
9 988 776,65 € we Francji 9 988 776,65 € w Niemczech 9 988 776,65 € w Stanach Zjednoczonych ----> Czy na pewno to działa?
Alexandru R
1

Po prostu zamień na ,replace ().

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

type () pokaże, że został przekształcony w float

Vibhor Karnawat
źródło
1

Lepsze rozwiązanie dla różnych formatów walut :

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
źródło