Как преобразовать строку с точкой и запятой в число с плавающей запятой в Python


86

Как я могу преобразовать строку вроде 123,456.908float 123456.908в Python?


9
Правильный способ сделать это - использовать localeмодуль - все остальное - просто очень неприятный прием, который доставит вам неприятности в будущем.
Ник Бастин,

Ответы:


130

Просто удалите с ,помощью replace():

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

14
это зависит от локали. 9 988 776,65 € во Франции 9 988 776,65 € в Германии 9 988 776,65 € в США
Alexandru R

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

Если вы пишете константу строкового литерала в исходном коде, а затем явно преобразуете ее в целое число или число с плавающей запятой, это признак того, что с дизайном что-то не так. Но даже если его можно защитить - просто временно установите языковой стандарт на тот, на котором написан код, для этого контекста, а затем восстановите контекст, соответствующий вашим пользователям, при обработке пользовательского ввода. Вот почему есть setlocaleв первую очередь.
Карл

не делайте этого, это допускает такие вещи, как "123 ,,,, 345"
amohr

148

... Или вместо того, чтобы рассматривать запятые как мусор, который нужно отфильтровать, мы могли бы рассматривать всю строку как локализованное форматирование float и использовать службы локализации:

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 09

2
Я бы проголосовал за этот ответ, если бы примеры включали в себя как десятичную точку, так и символы группировки цифр ...
Мартино,

14
Хорошо для сценария, плохо для библиотеки:Extension modules should never call setlocale()
blueFast

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большой молоток для такой задачи.
Роман Боднарчук

@John Doe: Теперь выглядит лучше. Мне нравится float(number)из-за его наглядности. +1 ;-)
Aufwind 09

2
9 988 776,65 € во Франции 9 988 776,65 € в Германии 9 988 776,65 € в США ----> Вы уверены, что это работает?
Alexandru R


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.