¿Cómo convertir una cadena en un número si tiene comas como miles de separadores?

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?

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

Genera un ValueError .

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

 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 

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

  1. El lugar adecuado para llamar a setlocale() está en el módulo __main__ . Es la configuración global y afectará a todo el progtwig 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 está emulada por Python). Lea las advertencias en la documentación y piense dos veces antes de seguir de esta manera. Probablemente esté bien en una sola aplicación, pero nunca la use en bibliotecas para una amplia audiencia. Probablemente debería evitar solicitar la configuración regional con alguna encoding de juego de caracteres particular, ya que puede no estar disponible en algunos sistemas.

  2. Utilice una de las bibliotecas de terceros para la internacionalización. Por ejemplo, PyICU permite usar cualquier configuración regional disponible sin afectar todo el proceso (e incluso analizar números con separadores de miles particulares sin usar configuraciones regionales):

    NumberFormat.createInstance (Locale (‘en_US’)). Parse (“1,000,000”). GetLong ()

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

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

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

Esto funciona:

(Una manera sucia pero rápida)

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

Recibí un error de configuración regional de una respuesta aceptada, pero el siguiente cambio funciona 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 

Intenté esto. 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, luego a flotar.

Va tan lejos como 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 
 #python3 tenzin def changenum(data): foo = "" for i in list(data): if i == ",": continue else: foo += i return float(int(foo)) 
 >>> 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 Estados Unidos.