¿Cómo puedo formatear un decimal para que siempre muestre 2 decimales?
Quiero mostrar:
49
como49.00
y:
54.9
como54.90
Independientemente de la longitud del decimal o si hay lugares decimales, me gustaría mostrar un Decimal
con 2 lugares decimales y me gustaría hacerlo de una manera eficiente. El propósito es mostrar valores monetarios.
p.ej,4898489.00
Para un problema análogo con el tipo integrado float
, consulte Limitar los puntos flotantes a dos puntos decimales .
Debe utilizar las nuevas especificaciones de formato para definir cómo se debe representar su valor:
>>> from math import pi # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'
La documentación puede ser un poco obtusa a veces, por lo que recomiendo las siguientes referencias, más fáciles de leer:
- el libro de recetas de formato de cadena de Python : muestra ejemplos del
.format()
formato de cadena de nuevo estilo - pyformat.info : compara el formato de cadena de estilo antiguo con el formato de cadena
%
de estilo nuevo.format()
Python 3.6 introdujo la interpolación de cadenas literales (también conocida como cadenas f), por lo que ahora puedes escribir lo anterior de manera aún más concisa como:
>>> f'{pi:.2f}'
'3.14'
La sección Operaciones de formato de cadenas de la documentación de Python contiene la respuesta que está buscando. En breve:
"%0.2f" % (num,)
Algunos ejemplos:
>>> "%0.2f" % 10
'10.00'
>>> "%0.2f" % 1000
'1000.00'
>>> "%0.2f" % 10.1
'10.10'
>>> "%0.2f" % 10.120
'10.12'
>>> "%0.2f" % 10.126
'10.13'
¿ Supongo que probablemente estés usando los Decimal()
objetos del decimal
módulo? (Si necesita exactamente dos dígitos de precisión más allá del punto decimal con números arbitrariamente grandes, definitivamente debería hacerlo, y eso es lo que sugiere el título de su pregunta...)
Si es así, la sección Preguntas frecuentes sobre decimales de los documentos tiene un par de preguntas y respuestas que pueden resultarle útiles:
P. En una aplicación de punto fijo con dos decimales, algunas entradas tienen muchos lugares y deben redondearse. Otros no deben tener dígitos sobrantes y necesitan ser validados. ¿Qué métodos se deben utilizar?
R. El método quantize() redondea a un número fijo de decimales. Si se establece la trampa Inexact, también es útil para la validación:
>>> TWOPLACES = Decimal(10) ** -2 # same as Decimal('0.01')
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
...
Inexact: None
La siguiente pregunta dice
P. Una vez que tengo entradas válidas de dos lugares, ¿cómo mantengo esa invariante en toda una aplicación?
Si necesita la respuesta (junto con mucha otra información útil), consulte la sección de documentos antes mencionada . Además, si mantiene su Decimal
s con dos dígitos de precisión más allá del punto decimal (es decir, tanta precisión como sea necesaria para mantener todos los dígitos a la izquierda del punto decimal y dos a la derecha y no más...), luego convertirlos en cadenas str
funcionará bien:
str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'