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.