Estoy tratando de imprimir un número entero en Python 2.6.1 con comas como miles de separadores. Por ejemplo, quiero mostrar el número 1234567
como 1,234,567
. ¿Cómo haría para hacer esto? He visto muchos ejemplos en Google, pero estoy buscando la forma práctica más simple.
No es necesario que sea específico de la localidad para decidir entre puntos y comas. Preferiría algo tan simple como sea razonablemente posible.
python
number-formatting
Elias Zamaria
fuente
fuente
{val:,}.format(val=val)
f"{2 ** 64 - 1:,}"
Tengo esto para trabajar:
Claro, no necesita soporte de internacionalización, pero es claro, conciso y utiliza una biblioteca incorporada.
PD: "% d" es el formateador de estilo% habitual. Puede tener solo un formateador, pero puede ser lo 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:La recursión es útil para el caso negativo, pero una recurrencia por coma me parece un poco excesiva.
fuente
locale
, uso lo menos que puedo.setlocale
usar el valor predeterminado, que con suerte será apropiado.Por ineficiencia e ilegibilidad es difícil de superar:
fuente
lambda x: (lambda s: ','.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('-,','-'))(str(x))
solo para mantener el tema de ofuscación.Aquí está el código de agrupación local después de eliminar partes irrelevantes y limpiarlo un poco:
(Lo siguiente solo funciona para enteros)
Ya hay algunas buenas respuestas aquí. Solo 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í
En python3.1 puedes hacer lo mismo así:
fuente
Me sorprende que nadie haya mencionado que puedes hacer esto con cadenas f en Python 3.6 tan fácil como esto:
... 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 una coma.Esto es equivalente a usar
format(num, ",")
para versiones anteriores de python 3.fuente
Aquí hay un reemplazo de expresiones regulares de una línea:
Funciona solo para salidas inegrales:
O para flotantes con menos de 4 dígitos, cambie el especificador de formato a
%.3f
:Nota: no funciona correctamente con más de tres dígitos decimales, ya que intentará agrupar la parte decimal:
Cómo funciona
Vamos a desglosarlo:
fuente
Esto es lo que hago para las carrozas. Aunque, sinceramente, no estoy seguro de para qué versiones funciona, estoy usando 2.7:
Devoluciones: 4,385,893.38
Actualización: Recientemente tuve un problema con este formato (no podía decirle la razón exacta), pero pude solucionarlo al soltar
0
:fuente
También puede usarlo
'{:n}'.format( value )
para una representación regional. Creo que esta es la forma más sencilla para una solución local.Para obtener más información, busque
thousands
en Python DOC .Para la moneda, puede usar
locale.currency
, estableciendo la banderagrouping
:Código
Salida
fuente
Ampliando ligeramente la respuesta de Ian Schneider:
Si desea utilizar un separador de miles personalizado, la solución más simple es:
Ejemplos
Si quieres una representación alemana como esta, se vuelve un poco más complicada:
fuente
'{:_.2f}'.format(12345.6789).replace('.', ',').replace('_', '.')
Estoy seguro de que debe haber una función de biblioteca estándar para esto, pero fue divertido intentar escribirlo yo mismo usando la recursión, así que esto es lo que se me ocurrió:
Habiendo dicho eso, si alguien más encuentra una forma estándar de hacerlo, debería usar eso en su lugar.
fuente
De los comentarios a la receta activa del estado 498181, volví a trabajar esto:
Utiliza la función de expresiones regulares: lookahead, es decir,
(?=\d)
para asegurarse de que solo los grupos de tres dígitos que tienen un dígito 'después' obtengan una coma. Digo 'después' porque la cadena es inversa en este punto.[::-1]
solo invierte una cadena.fuente
La respuesta aceptada está bien, pero en realidad prefiero
format(number,',')
. Más fácil para mí interpretar y recordar.https://docs.python.org/3/library/functions.html#format
fuente
Python 3
-
Enteros (sin decimal):
"{:,d}".format(1234567)
-
Flotadores (con decimal):
"{:,.2f}".format(1234567)
donde el número anterior
f
especifica el número de decimales.-
Prima
Función de arranque rápido y sucio para el sistema de numeración indio lakhs / crores (12,34,567):
https://stackoverflow.com/a/44832241/4928578
fuente
desde Python versión 2.6 puedes hacer esto:
Para las versiones de Python <2.6 y solo para su información, aquí hay 2 soluciones manuales, convierten los flotantes en ints pero los números negativos funcionan correctamente:
Algunas cosas para notar aquí:
Y una versión más hardcore:
fuente
Soy un principiante de Python, pero un programador experimentado. Tengo Python 3.5, así que puedo usar la coma, pero este es un ejercicio de programación interesante. Considere el caso de un entero sin signo. El programa Python más legible para agregar miles de separadores parece ser:
También es posible utilizar una lista de comprensión:
Esto es más corto, y podría ser de una sola línea, pero tendrás que hacer algo de gimnasia mental para entender por qué funciona. En ambos casos obtenemos:
La primera versión es la opción más sensata, si desea que se entienda el programa.
fuente
Aquí hay uno que también funciona para carrozas:
Ejemplo de uso:
fuente
float2comma(12031023.1323)
devuelve: '12, 031,023.132,3 'Un revestimiento para Python 2.5+ y Python 3 (solo int positivo):
fuente
Solución universal
He encontrado algunos problemas con el separador de puntos en las respuestas más votadas anteriores. He diseñado una solución universal donde puedes usar lo que quieras como un separador de miles sin modificar la configuración regional . Sé que no es la solución más elegante, pero hace el trabajo. ¡Siéntete libre de mejorarlo!
fuente
Esto hace dinero junto con las comas
fuente
Tengo una versión de python 2 y python 3 de este código. Sé que la pregunta se hizo para Python 2, pero ahora (8 años después, jajaja) la gente probablemente usará Python 3.
Código Python 3:
Código de Python 2: (Editar. El código de Python 2 no funciona. Creo que la sintaxis es diferente).
fuente
Estoy usando Python 2.5, así que no tengo acceso al formato incorporado.
Miré el código Django intcomma (intcomma_recurs en el código a continuación) y me di cuenta de que es ineficiente, porque es recursivo y también compilar la expresión regular en cada ejecución tampoco es algo bueno. Esto no es necesariamente un 'problema' ya que django no está realmente tan enfocado en este tipo de rendimiento de bajo nivel. Además, esperaba un factor de diferencia de 10 en el rendimiento, pero es solo 3 veces más lento.
Por curiosidad, implementé algunas versiones de intcomma para ver cuáles son las ventajas de rendimiento al usar regex. Los datos de mi prueba concluyen una ligera ventaja para esta tarea, pero sorprendentemente no mucho.
También me complació ver lo que sospechaba: el uso del enfoque de xrange inverso es innecesario en el caso de no regex, pero hace que el código se vea un poco mejor a un costo de ~ 10% de rendimiento.
Además, supongo que lo que está pasando es una cadena y se parece un poco a un número. Resultados indeterminados de otra manera.
Y aquí están los resultados de la prueba:
fuente
esto se cuece en python por PEP -> https://www.python.org/dev/peps/pep-0378/
solo use el formato (1000, ', d') para mostrar un número entero con separador de miles
hay más formatos descritos en el PEP, tenga en él
fuente
Aquí hay otra variante que usa una función de generador que funciona para enteros:
Y aquí hay una prueba:
fuente
Solo subclase
long
(ofloat
, o lo que sea). Esto es muy práctico, porque de esta manera todavía puede usar sus números en operaciones matemáticas (y, por lo tanto, el código existente), pero todos se imprimirán bien en su terminal.fuente
__repr__()
el método correcto para anular? Sugeriría anular__str__()
y dejar__repr__()
solo, porqueint(repr(number(928374)))
debería funcionar, peroint()
se ahogará con las comas.number(repr(number(928374)))
no funciona, noint(repr(number(928374)))
. De todos modos, para hacer que este enfoque funcione directamenteprint
, como lo solicitó el OP, el__str__()
método debería ser el anulado en lugar de hacerlo__repr__()
. En cualquier caso, parece haber un error en la lógica de inserción de comas principales.Italia:
fuente
Para carrozas:
Para entradas:
fuente
float('1,234.52'.translate(None, ','))
podría ser más sencillo y posiblemente más rápido.