Como posso converter uma string com ponto e vírgula em um float em Python

94

Como posso converter uma string 123,456.908para flutuar 123456.908no Python?

Kevinlu
fonte
11
A maneira correta de fazer isso é usar o localemódulo - todo o resto é apenas um hack muito desagradável que o colocará em apuros no futuro.
Nick Bastin

Respostas:

134

Basta remover ,com replace():

float("123,456.908".replace(',',''))
zeekay
fonte
15
isso depende da localidade. 9 988 776,65 € na França 9.988.776,65 € na Alemanha $ 9.988.776,65 nos Estados Unidos
Alexandru R
Se você está escrevendo constantes no código-fonte e deseja usar vírgulas para torná-lo mais legível, este é o caminho a seguir, em vez de localidade, o que faria o código falhar em outro local. python cd_size = float("737,280,000".replace(',','')) (Na verdade, usei int)
hum3 01 de
Se você está escrevendo uma constante literal de string no código-fonte e, em seguida, convertendo-a explicitamente em inteiro ou flutuante, isso é um sinal de que há algo errado com o design. Mas mesmo se puder ser defendido - apenas defina temporariamente o local para aquele em que o código está escrito, para esse contexto e, em seguida, restaure o contexto apropriado para seus usuários ao lidar com a entrada do usuário. É por isso que existe setlocaleem primeiro lugar.
Karl Knechtel
não faça isso, ele permite coisas como "123 ,,,, 345"
amohr
152

... Ou, em vez de tratar as vírgulas como lixo a ser filtrado, poderíamos tratar a string geral como uma formatação localizada do float e usar os serviços de localização:

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
Karl Knechtel
fonte
4
Forma mais pitônica e intuitiva até agora. +1
Aufwind
2
Eu votaria a favor desta resposta se os exemplos incluíssem um ponto decimal e caracteres de agrupamento de dígitos neles ...
martineau
14
Bom para um script, ruim para uma biblioteca:Extension modules should never call setlocale()
blueFast
13
@wanderer: o que está obsoleto é o atof método embutido de strings . O que estou usando aqui é a função atofdo localemódulo de biblioteca padrão, que não foi descontinuado.
Karl Knechtel
5
É por isso que as importações de estrela são ruins - sugiro que você edite para importar o que é necessário ou um namespace melhor como emlocale.atof
Mr_and_Mrs_D
8

Se você não souber a localidade e quiser analisar qualquer tipo de número, use esta parseNumber(text)função . Não é perfeito, mas leva em consideração a maioria dos casos:

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

Se você tiver uma vírgula como separador de decimais e o ponto como separador de milhares, você pode fazer:

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

Espero que ajude

Luca Di Liello
fonte
6

Que tal isso?

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

Em resumo:

my_float = float(my_string.replace(',', ''))
Aufwind
fonte
2
s =  "123,456.908"
print float(s.replace(',', ''))
Andreas Jung
fonte
2
resposta duplicada.
Philippe Remy
2

Esta é uma maneira simples que escrevi para você. :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908
John Doe
fonte
reé um grande martelo para tal tarefa.
Roman Bodnarchuk
@John Doe: Parece muito melhor agora. Gosto float(number)por causa de seu toque descritivo. +1 ;-)
Aufwind
2
9 988 776,65 € na França 9.988.776,65 € na Alemanha $ 9.988.776,65 nos Estados Unidos ----> Tem certeza de que funciona?
Alexandru R
1

Basta substituir ,por replace ().

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

type () irá mostrar a você que ele foi convertido em um float

Vibhor Karnawat
fonte
1

Melhor solução para diferentes formatos de moeda :

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))
Quincy Hsieh
fonte