¿Cómo puedo convertir una cadena con punto y coma en un flotador en Python?

86

¿Cómo puedo convertir una cadena como 123,456.908flotar 123456.908en Python?

Kevinlu
fuente
9
La forma correcta de hacer esto es usar el localemódulo; todo lo demás es solo un truco muy desagradable que te meterá en problemas en el futuro.
Nick Bastin

Respuestas:

129

Simplemente elimine el ,con replace():

float("123,456.908".replace(',',''))
zeekay
fuente
14
esto depende de la localidad. 9988776,65 € en Francia 9.988.776,65 € en Alemania $ 9,988,776.65 en los Estados Unidos
Alexandru R
Si está escribiendo constantes en el código fuente y desea usar comas para hacerlo más legible, este es el camino a seguir en lugar de la configuración regional, lo que haría que el código fallara en otra ubicación. python cd_size = float("737,280,000".replace(',','')) (De hecho usé int)
hum3
Si está escribiendo una constante literal de cadena en el código fuente y luego la convierte explícitamente en entero o flotante, eso es una señal de que algo anda mal con el diseño. Pero incluso si se puede defender, simplemente configure temporalmente la configuración regional en la que está escrito el código, para ese contexto, y luego restaure el contexto apropiado para sus usuarios al manejar la entrada del usuario. Es por eso que hay setlocaleen primer lugar.
Karl Knechtel
no hagas esto, permite cosas como "123 ,,,, 345"
amohr
148

... O en lugar de tratar las comas como basura para filtrar, podríamos tratar la cadena general como un formato localizado del flotante y usar los servicios de localización:

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
fuente
3
La forma más pitónica e intuitiva hasta ahora. +1
Aufwind
2
Votaría a favor de esta respuesta si los ejemplos incluyen tanto un punto decimal como caracteres de agrupación de dígitos en ellos ...
martineau
14
Bien para un guión, mal para una biblioteca:Extension modules should never call setlocale()
blueFast
12
@wanderer: lo que está en desuso es el atof método incorporado de cadenas . Lo que estoy usando aquí es la función atofdel localemódulo de biblioteca estándar, que no está obsoleta en absoluto.
Karl Knechtel
5
Es por eso que las importaciones de estrellas son malas; le sugiero que edite esto para importar lo que se necesita o un mejor espacio de nombres como enlocale.atof
Mr_and_Mrs_D
6

¿Qué pasa con esto?

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

En breve:

my_float = float(my_string.replace(',', ''))
Aufwind
fuente
6

Si tiene una coma como separador de decimales y el punto como separador de miles, puede hacer:

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

Espero que ayude

Luca Di Liello
fuente
5

Si no conoce la configuración regional y desea analizar cualquier tipo de número, use esta parseNumber(text)función . No es perfecto pero ten en cuenta la mayoría de los 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
fuente
2
s =  "123,456.908"
print float(s.replace(',', ''))
Andreas Jung
fuente
2
respuesta duplicada.
Philippe Remy
2

He aquí una forma sencilla que escribí para ti. :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908
John Doe
fuente
rees un gran martillo para tal tarea.
Roman Bodnarchuk
@John Doe: Se ve mucho mejor ahora. Me gusta float(number)por su toque descriptivo. +1 ;-)
Aufwind
2
9 988 776,65 € en Francia 9.988.776,65 € en Alemania $ 9,988,776.65 en los Estados Unidos ----> ¿Estás seguro de que funciona?
Alexandru R
1

Simplemente reemplácelo ,con replace ().

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

type () le mostrará que se ha convertido en un flotador

Vibhor Karnawat
fuente
1

Mejor solución para diferentes formatos de moneda :

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
fuente