Cómo imprimir un número usando comas como separadores de miles

Resuelto Elias Zamaria asked hace 14 años • 31 respuestas

¿Cómo imprimo un número entero con comas como separadores de miles?

12345671,234,567

No es necesario que sea específico de la región para decidir entre puntos y comas.

Elias Zamaria avatar Dec 01 '09 06:12 Elias Zamaria
Aceptado

Independientemente de la configuración regional: utilizar _como separador de miles

f'{value:_}'          # For Python ≥3.6

Estilo inglés: utilizar ,como separador de mil

'{:,}'.format(value)  # For Python ≥2.7
f'{value:,}'          # For Python ≥3.6

Consciente de la configuración regional

import locale
locale.setlocale(locale.LC_ALL, '')  # Use '' for auto, or force e.g. to 'en_US.UTF-8'

'{:n}'.format(value)  # For Python ≥2.7
f'{value:n}'          # For Python ≥3.6

Referencia

Según la especificación de formato Minilenguaje ,

La ','opción indica el uso de una coma como separador de miles. Para un separador que tenga en cuenta la configuración regional, utilice 'n'en su lugar el tipo de presentación entero.

y:

La '_'opción señala el uso de un guión bajo para un separador de miles para tipos de presentación de punto flotante y para el tipo de presentación de enteros 'd'. Para los tipos de presentación de números enteros 'b', 'o', 'x'y 'X', se insertarán guiones bajos cada 4 dígitos.

Ian Schneider avatar May 24 '2012 18:05 Ian Schneider

Me sorprende que nadie haya mencionado que puedes hacer esto con f-strings en Python 3.6+ tan fácil como esto:

>>> num = 10000000
>>> print(f"{num:,}")
10,000,000

... donde la parte después de los dos puntos es el especificador de formato. La coma es el carácter separador que desea, por lo que f"{num:_}"utiliza guiones bajos en lugar de coma. Con este método sólo se pueden utilizar "," y "_".

Esto es equivalente a usarlo format(num, ",")para versiones anteriores de Python 3.

Esto puede parecer mágico cuando lo ves la primera vez, pero no lo es. Es solo parte del lenguaje y algo que comúnmente se necesita lo suficiente como para tener un acceso directo disponible. Para leer más al respecto, eche un vistazo al subcomponente del grupo .

Emil Stenström avatar Jul 28 '2017 07:07 Emil Stenström

Conseguí que esto funcionara:

>>> import locale
>>> locale.setlocale(locale.LC_ALL, 'en_US')
'en_US'
>>> locale.format_string("%d", 1255000, grouping=True)
'1,255,000'

Claro, no necesita soporte de internacionalización, pero es claro, conciso y utiliza una biblioteca incorporada.

PD: Ese "%d" es el formateador habitual de estilo %. Sólo puede tener un formateador, pero puede ser el que necesite en términos de ancho de campo y configuración de precisión.

PPS Si no puede ponerse localea trabajar, le sugiero una versión modificada de la respuesta de Mark:

def intWithCommas(x):
    if type(x) not in [type(0), type(0L)]:
        raise TypeError("Parameter must be an integer.")
    if x < 0:
        return '-' + intWithCommas(-x)
    result = ''
    while x >= 1000:
        x, r = divmod(x, 1000)
        result = ",%03d%s" % (r, result)
    return "%d%s" % (x, result)

La recursividad es útil para el caso negativo, pero una recursividad por coma me parece un poco excesiva.

PPPS Se utilizan pitones más antiguos formaten lugar de format_string.

Mike DeSimone avatar Nov 30 '2009 23:11 Mike DeSimone

Por ineficiencia e ilegibilidad es difícil de superar:

>>> import itertools
>>> s = '-1234567'
>>> ','.join(["%s%s%s" % (x[0], x[1] or '', x[2] or '') for x in itertools.izip_longest(s[::-1][::3], s[::-1][1::3], s[::-1][2::3])])[::-1].replace('-,','-')
Kasey Kirkham avatar Jan 19 '2012 19:01 Kasey Kirkham

Aquí está el código de agrupación regional después de eliminar partes irrelevantes y limpiarlas un poco:

(Lo siguiente sólo funciona para números enteros)

def group(number):
    s = '%d' % number
    groups = []
    while s and s[-1].isdigit():
        groups.append(s[-3:])
        s = s[:-3]
    return s + ','.join(reversed(groups))

>>> group(-23432432434.34)
'-23,432,432,434'

Ya hay algunas buenas respuestas aquí. Sólo quiero agregar esto para referencia futura. En Python 2.7 habrá un especificador de formato para el separador de miles. Según los documentos de Python , funciona así

>>> '{:20,.2f}'.format(f)
'18,446,744,073,709,551,616.00'

En python3.1 puedes hacer lo mismo así:

>>> format(1234567, ',d')
'1,234,567'
Nadia Alramli avatar Nov 30 '2009 23:11 Nadia Alramli