Як я можу перетворити рядок з крапкою та комою у плаваючу в 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.