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?


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(',',''))

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

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(',', ''))

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


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


2

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

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908

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


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))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.