Как преобразовать строку с точкой и запятой в число с плавающей запятой в 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(',', ''))
Aufwind
источник
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
s =  "123,456.908"
print float(s.replace(',', ''))
Андреас Юнг
источник
2
повторяющийся ответ.
Филипп Реми
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
1

Просто замените ,на replace ().

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

type () покажет вам, что он преобразован в float

Вибхор Карнават
источник
1

Лучшее решение для разных валютных форматов :

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))
Куинси Се
источник