¿Cómo puedo formatear un decimal para que siempre muestre 2 decimales?

Resuelto orokusaki asked hace 14 años • 13 respuestas

Quiero mostrar:

49como49.00

y:

54.9como54.90

Independientemente de la longitud del decimal o si hay lugares decimales, me gustaría mostrar un Decimalcon 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 .

orokusaki avatar Jan 04 '10 00:01 orokusaki
Aceptado

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'
BioGeek avatar Jan 20 '2012 11:01 BioGeek

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'
Travis Bradshaw avatar Jan 03 '2010 17:01 Travis Bradshaw

¿ Supongo que probablemente estés usando los Decimal()objetos del decimalmó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 Decimals 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 strfuncionará bien:

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'
Michał Marczyk avatar Jan 03 '2010 18:01 Michał Marczyk