2009-11-22 9 views
59

Tengo una cadena que representa un número que usa comas para separar miles. ¿Cómo puedo convertir esto a un número en Python?¿Cómo uso Python para convertir una cadena en un número si tiene comas como separadores de miles?

>>> int("1,000,000") 

Genera un ValueError.

Podría reemplazar las comas con cadenas vacías antes de intentar convertirlas, pero eso parece estar mal de alguna manera. ¿Hay una mejor manera?

+1

¿Cómo se siente mal? La función está ahí por una razón. –

Respuesta

79
import locale 
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
locale.atoi('1,000,000') 
# 1000000 
locale.atof('1,000,000.53') 
# 1000000.53 
+0

¿No hay lugares donde eso no funcionará? – abyx

+8

+1, pero por favor agregue la configuración regional (con una configuración regional predeterminada de ''C'' esto todavía daría un' ValueError'!). –

+1

Creo que el gurú significa algo como esto: locale.setlocale (locale.LC_ALL, 'en_US.UTF-8') – mbarkhau

30

Hay varias formas de analizar números con miles de separadores. Y dudo que la forma descrita por ~ ubuntu sea la mejor en todos los casos. Es por eso que enumero otras formas también.

  1. El lugar apropiado llamar setlocale() está en __main__ módulo. Es una configuración global y afectará a todo el programa e incluso a las extensiones C (aunque tenga en cuenta que la configuración LC_NUMERIC no está establecida a nivel del sistema, sino que es emulada por Python). Lee caveats in documentation y piénsalo dos veces antes de ir por este camino. Probablemente esté bien en una sola aplicación, pero nunca la use en bibliotecas para una gran audiencia. Probablemente deberías evitar solicitar la configuración regional con alguna codificación de juego de caracteres en particular, ya que podría no estar disponible en algunos sistemas.

  2. Utilice una de las bibliotecas de terceros para la internacionalización. Por ejemplo PyICU permite el uso de cualquier localidad disponible wihtout que afecta a todo el proceso (e incluso análisis de números con separadores de miles particulares sin necesidad de utilizar locales):.

    NumberFormat.createInstance (Locale ('en_US')) analizar ("1000000"). getLong()

  3. Escriba su propia función de análisis sintáctico, si no tiene qué instalar bibliotecas de terceros para hacerlo "correctamente". Puede ser tan simple como int(data.replace(',', '')) cuando no se necesita una validación estricta.

+0

+1 por recomendar la manera más simple. Eso es todo lo que necesitaba cuando tuve el mismo problema. –

+0

Editado para corregir un error tipográfico ('setlocate' debe ser' setlocale'). Además, +1. –

+0

autopromoción desvergonzada, utilicé la tercera opción. Entonces, si alguien está interesado, eche un vistazo a [** esta pregunta/respuesta **] (https://stackoverflow.com/questions/48843193/convert-a-number-using-atof/48845430#48845430) – Jan

3

llegué error local de respuesta aceptada, pero el siguiente cambio trabaja aquí en Finlandia (Windows XP):

import locale 
locale.setlocale(locale.LC_ALL, 'english_USA') 
print locale.atoi('1,000,000') 
# 1000000 
print locale.atof('1,000,000.53') 
# 1000000.53 
3

Esto funciona:

(A manera sucia pero rápido)

>>> a='-1,234,567,89.0123' 
>>> "".join(a.split(",")) 
'-123456789.0123' 
7

Reemplace las comas con cadenas vacías, y convierta la cadena resultante en int o una float.

>>> a = '1,000,000' 
>>> int(a.replace(',' , '')) 
1000000 
>>> float(a.replace(',' , '')) 
1000000.0 
+13

Por favor, lea de nuevo la pregunta OP. En particular, cuando dice: "Podría reemplazar las comas con cadenas vacías antes de intentar convertirlas, pero de alguna manera eso parece estar mal. ¿Hay alguna manera mejor?" – joaquin

0
>>> import locale 
>>> locale.setlocale(locale.LC_ALL, "") 
'en_US.UTF-8' 
>>> print locale.atoi('1,000,000') 
1000000 
>>> print locale.atof('1,000,000.53') 
1000000.53 

esto se hace en Linux en los Estados Unidos. -Suresh

0
#python3 tenzin 
def changenum(data): 
    foo = "" 
    for i in list(data): 
     if i == ",": 
      continue 
     else: 
      foo += i 
    return float(int(foo)) 
1

yo probamos este. Va un poco más allá de la pregunta: Obtienes una entrada. Primero se convertirá en cadena (si es una lista, por ejemplo, de Beautiful soup); luego a int, y luego flotar.

Llega todo lo lejos que puede llegar.En el peor de los casos, devuelve todo lo no convertido como cadena.

def to_normal(soupCell): 
''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets. 
US thousands separators are taken into account. 
needs import locale''' 

locale.setlocale(locale.LC_ALL, 'english_USA') 

output = unicode(soupCell.findAll(text=True)[0].string) 
try: 
    return locale.atoi(output) 
except ValueError: 
    try: return locale.atof(output) 
    except ValueError: 
     return output 
Cuestiones relacionadas