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?


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(',',''))

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

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

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


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(',', ''))


2

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

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

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


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))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.