Cómo imprimir un número usando comas como separadores de miles
¿Cómo imprimo un número entero con comas como separadores de miles?
1234567 ⟶ 1,234,567
No es necesario que sea específico de la región para decidir entre puntos y comas.
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.
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 .
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 locale
a 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 format
en lugar de format_string
.
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('-,','-')
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'