Mam ciąg reprezentujący liczbę, która używa przecinków do oddzielenia tysięcy. Jak mogę przekonwertować to na liczbę w Pythonie?
>>> int("1,000,000")
Generuje plik ValueError
.
Mógłbym zastąpić przecinki pustymi ciągami znaków, zanim spróbuję je przekonwertować, ale jakoś wydaje się to złe. Czy jest lepszy sposób?
'C'
nadal dałoby toValueError
!).Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File "F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
Istnieje kilka sposobów analizowania liczb z separatorami tysięcy. I wątpię, czy sposób opisany przez @unutbu jest najlepszy we wszystkich przypadkach. Dlatego wymieniam też inne sposoby.
Właściwe miejsce do dzwonienia
setlocale()
to__main__
moduł. Jest to ustawienie globalne i będzie miało wpływ na cały program, a nawet rozszerzenia C (chociaż zauważ, że ustawienie LC_NUMERIC nie jest ustawione na poziomie systemu, ale jest emulowane przez Python). Czytać zastrzeżenia w dokumentacji i zastanów się dwa razy, zanim pójdziesz tą drogą. Prawdopodobnie jest OK w pojedynczej aplikacji, ale nigdy nie używaj jej w bibliotekach dla szerokiego grona odbiorców. Prawdopodobnie powinieneś unikać żądania ustawień regionalnych z określonym kodowaniem zestawu znaków, ponieważ może to nie być dostępne w niektórych systemach.Użyj jednej z bibliotek innych firm do internacjonalizacji. Na przykład PyICU pozwala na użycie dowolnego dostępnego locale bez wpływu na cały proces (a nawet parsowanie liczb z określonymi separatorami tysięcy bez używania ustawień regionalnych):
NumberFormat.createInstance (Locale ('en_US')). Parse ("1,000,000"). GetLong ()
Napisz własną funkcję parsującą, jeśli nie wiesz, co zainstalować biblioteki innych firm, aby zrobić to „we właściwy sposób”. Może to być tak proste, jak
int(data.replace(',', ''))
wtedy, gdy ścisła walidacja nie jest potrzebna.źródło
setlocate
powinno byćsetlocale
). Ponadto +1.Zastąp przecinki pustymi ciągami i zamień wynikowy ciąg na
int
znak lub afloat
.>>> a = '1,000,000' >>> int(a.replace(',' , '')) 1000000 >>> float(a.replace(',' , '')) 1000000.0
źródło
To działa:
(Brudny, ale szybki sposób)
>>> a='-1,234,567,89.0123' >>> "".join(a.split(",")) '-123456789.0123'
źródło
Otrzymałem błąd lokalny z zaakceptowanej odpowiedzi, ale następująca zmiana działa tutaj w Finlandii (Windows XP):
import locale locale.setlocale( locale.LC_ALL, 'english_USA' ) print locale.atoi('1,000,000') # 1000000 print locale.atof('1,000,000.53') # 1000000.53
źródło
Próbowałem tego. To wykracza nieco poza pytanie: otrzymujesz wkład. Najpierw zostanie przekonwertowany na ciąg znaków (jeśli jest to lista, na przykład z Beautiful soup); potem do int, a potem do float.
To idzie tak daleko, jak to tylko możliwe. W najgorszym przypadku zwraca wszystko nieprzekonwertowane jako ciąg.
def to_normal(soupCell): ''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets. US thousands separators are taken into account. needs import locale''' locale.setlocale( locale.LC_ALL, 'english_USA' ) output = unicode(soupCell.findAll(text=True)[0].string) try: return locale.atoi(output) except ValueError: try: return locale.atof(output) except ValueError: return output
źródło
>>> import locale >>> locale.setlocale(locale.LC_ALL, "") 'en_US.UTF-8' >>> print locale.atoi('1,000,000') 1000000 >>> print locale.atof('1,000,000.53') 1000000.53
odbywa się to w systemie Linux w USA.
źródło
#python3 tenzin def changenum(data): foo = "" for i in list(data): if i == ",": continue else: foo += i return float(int(foo))
źródło