Як я можу перетворити рядок з крапкою та комою у плаваючу в Python


86

Як я можу перетворити рядок, подібний 123,456.908плаваючому 123456.908в Python?


9
Правильний спосіб зробити це - використовувати localeмодуль - все інше - це просто дуже неприємний хак, який в майбутньому призведе до неприємностей.
Нік Бастін,

Відповіді:


129

Просто видаліть за ,допомогою replace():

float("123,456.908".replace(',',''))

14
це залежить від мови. 9 988 776,65 євро у Франції 9 988 776,65 євро в Німеччині 9 988 776,65 доларів у США
Александру Р

Якщо ви пишете константи у вихідному коді і хочете використовувати коми, щоб зробити його більш читабельним, тоді це шлях, а не локаль, який в подальшому змусить код провалитися в іншому місці. python cd_size = float("737,280,000".replace(',','')) (Я насправді використовував int)
hum3

Якщо ви пишете ланцюгову літеральну константу у вихідному коді, а потім явно перетворюєте її на ціле число або плаваюче значення, це ознака чогось не так з дизайном. Але навіть якщо його можна захистити - просто тимчасово встановіть для цього контексту локаль, на який написаний код, а потім відновіть контекст, відповідний вашим користувачам при обробці вводу користувача. Ось чому є setlocaleв першу чергу.
Karl

не роби цього, це дозволяє такі речі, як "123 ,,,, 345"
amohr

148

... Або замість того, щоб розглядати коми як сміття, яке потрібно відфільтрувати, ми могли б розглядати загальний рядок як локалізоване форматування поплавця та використовувати служби локалізації:

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
Найбільш пітонічний та інтуїтивний спосіб досі. +1
Aufwind

2
Я б проголосував за цю відповідь, якби приклади включали в них як десяткову крапку, так і символи групування цифр ...
martineau

14
Чудово Extension modules should never call setlocale()
підходить

12
@wanderer: застарілим є atof вбудований метод рядків . Тут я використовую функцію atofзі localeстандартного модуля бібліотеки, яка взагалі не є застарілою.
Карл Кнехтель

5
Ось чому імпорт зірок поганий - я б запропонував вам відредагувати це, щоб імпортувати те, що потрібно, або кращий простір імен, як уlocale.atof
Mr_and_Mrs_D

6

Як що до цього?

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

Коротко:

my_float = float(my_string.replace(',', ''))

6

Якщо у вас є кома як роздільник десяткових знаків, а крапка - як роздільник тисяч, ви можете зробити:

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

Сподіваюся, це допоможе


5

Якщо ви не знаєте локаль і хочете проаналізувати будь-який номер, скористайтеся цією parseNumber(text)функцією . Це не ідеально, але враховуйте більшість випадків:

>>> 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

Ось простий спосіб, який я вам написав. :)

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

reє великим молотком для такого завдання.
Роман Боднарчук

@ Джон Доу: Зараз виглядає набагато краще. Мені подобається float(number)завдяки його описовому дотику. +1 ;-)
Ауфвінд

2
9 988 776,65 € у Франції 9 988 776,65 € у Німеччині 9 988 776,65 USD у Сполучених Штатах ----> Ви впевнені, що це працює?
Alexandru R

1

Просто замініть ,на replace ().

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

type () покаже вам, що він перетворився на float


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.