web-dev-qa-db-fra.com

Comment formater une décimale pour toujours afficher 2 décimales?

Je veux afficher:

49 comme 49.00

et:

54.9 comme 54.90

Indépendamment de la longueur de la virgule ou de la position décimale, j'aimerais afficher un Decimal avec 2 décimales, et j'aimerais le faire de manière efficace. Le but est d'afficher des valeurs en argent.

par exemple, 4898489.00

202
orokusaki

Je suppose que vous utilisez probablement les Decimal() objets du module decimal ? (Si vous avez besoin de deux chiffres de précision au-delà de la virgule avec des nombres arbitrairement grands, vous devriez le faire, et c'est ce que suggère le titre de votre question ...)

Si tel est le cas, la section décimale FAQ de la documentation comporte une paire question/réponse qui peut vous être utile:

Q. Dans une application à virgule fixe à deux décimales, certaines entrées ont plusieurs emplacements et doivent être arrondies. D'autres ne sont pas supposés avoir des chiffres en excès et doivent être validés. Quelles méthodes devraient être utilisées?

A. La méthode quantize () arrondit à un nombre fixe de décimales. Si le piège Inexact est défini, il est également utile pour la validation:

>>> 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 prochaine question se lit

Q. Une fois que j'ai des entrées valides à deux places, comment puis-je maintenir cet invariant dans une application?

Si vous avez besoin de réponse à cette question (ainsi que de nombreuses autres informations utiles), consultez la section susmentionnée de la documentation . De plus, si vous conservez votre Decimals avec deux chiffres de précision au-delà du point décimal (c'est-à-dire avec autant de précision qu'il est nécessaire de conserver tous les chiffres à gauche du point et deux à sa droite et pas plus ...), puis les convertir en chaînes avec str fonctionnera correctement:

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'
96
Michał Marczyk

Vous devez utiliser le nouvelles spécifications de format pour définir comment votre valeur doit être représentée:

>>> from math import pi  # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'

La documentation peut parfois être un peu obtuse, je recommande donc les références suivantes, plus faciles à lire:

Python 3.6 introduit interpolation de chaîne littérale (également connu sous le nom de chaîne de caractères f). Vous pouvez maintenant écrire ce qui précède encore plus succinctement:

>>> f'{pi:.2f}'
'3.14'
453
BioGeek

La section opérations de formatage de chaînes de la documentation Python contient la réponse à votre question. En bref:

"%0.2f" % (num,)

Quelques exemples:

>>> "%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'
132
Travis Bradshaw

Vous pouvez utiliser le opérateur de formatage de chaîne comme suit:

num = 49
x = "%.2f" % num  # x is now the string "49.00"

Je ne suis pas sûr de ce que vous entendez par "efficace" - ceci est presque certainement pas le goulot d'étranglement de votre application. Si votre programme est lent, profilez-le d'abord pour trouver les points chauds, puis optimisez-les.

29
Adam Rosenfield
>>> print "{:.2f}".format(1.123456)
1.12

Vous pouvez remplacer 2 dans 2f par le nombre de points décimaux à afficher.

MODIFIER:

De Python3.6, cela se traduit par:

>>> print(f"{1.1234:.2f}")
1.12
23
Aziz Alto

Le format .format est un moyen plus lisible de gérer le formatage variable:

'{:.{prec}f}'.format(26.034, prec=2)
19
Mayank Patel

Dans python 3, une façon de le faire serait

'{0:.2f}'.format(number)
9
Devin Ersoy

si vous avez plusieurs paramètres, vous pouvez utiliser

 print('some string {0:.2f} & {1:.2f}'.format(1.1234,2.345))
 >>> some string 1.12 & 2.35
6
sushmit