web-dev-qa-db-de.com

Wie kann ich eine Dezimalstelle so formatieren, dass immer 2 Dezimalstellen angezeigt werden?

Ich möchte anzeigen:

49 wie 49.00

und:

54.9 wie 54.90

Unabhängig von der Länge der Dezimalstelle oder ob es Dezimalstellen gibt, möchte ich ein Decimal mit 2 Dezimalstellen anzeigen und dies auf effiziente Weise tun. Der Zweck ist, Geldwerte anzuzeigen.

z.B, 4898489.00

202
orokusaki

Vermutlich verwenden Sie die Objekte Decimal() aus dem Modul decimal . (Wenn Sie bei beliebig großen Zahlen genau zwei Nachkommastellen benötigen, sollten Sie dies unbedingt tun, und der Titel Ihrer Frage legt dies nahe ...)

In diesem Fall enthält der Abschnitt Decimal FAQ der Dokumentation ein Frage/Antwort-Paar, das für Sie nützlich sein kann:

F. In einer Festkommaanwendung mit zwei Dezimalstellen haben einige Eingaben viele Stellen und müssen gerundet werden. Andere dürfen keine überzähligen Ziffern enthalten und müssen validiert werden. Welche Methoden sollten angewendet werden?

A. Die quantize () -Methode rundet auf eine feste Anzahl von Dezimalstellen. Wenn die Inexact-Falle gesetzt ist, ist dies auch für die Validierung nützlich:

>>> 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

Die nächste Frage lautet

Frage: Wie kann ich die Invariante während einer Anwendung beibehalten, wenn ich gültige Eingaben für zwei Stellen habe?

Wenn Sie eine Antwort darauf benötigen (zusammen mit vielen anderen nützlichen Informationen), lesen Sie im oben genannten Abschnitt der Dokumentation . Wenn Sie Ihr Decimals mit einer Genauigkeit von zwei Stellen hinter dem Dezimalpunkt belassen (dh so viel Genauigkeit, wie erforderlich ist, um alle Stellen links vom Dezimalpunkt und zwei rechts davon und nicht mehr davon zu belassen) ...), dann werden sie mit str in Strings konvertiert:

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

Sie sollten das neue Formatspezifikationen verwenden, um zu definieren, wie Ihr Wert dargestellt werden soll:

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

Die Dokumentation kann manchmal etwas stumpf sein, daher empfehle ich die folgenden, besser lesbaren Verweise:

In Python 3.6 wurde wörtliche Zeichenfolgeninterpolation (auch als f-Zeichenfolgen bezeichnet) eingeführt. Jetzt können Sie das Obige noch prägnanter schreiben als:

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

Der Abschnitt Formatieren von Zeichenfolgen der Dokumentation Python=) enthält die Antwort, nach der Sie suchen.

"%0.2f" % (num,)

Einige Beispiele:

>>> "%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

Sie können den Operator Zeichenfolgenformatierung folgendermaßen verwenden:

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

Ich bin nicht sicher, was Sie mit "effizient" meinen - dies ist mit ziemlicher Sicherheit nicht der Engpass Ihrer Anwendung. Wenn Ihr Programm langsam ausgeführt wird, profilieren Sie es zuerst, um die Hotspots zu finden und diese dann zu optimieren.

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

Du kannst ändern 2 im 2f auf eine beliebige Anzahl von Dezimalstellen, die Sie anzeigen möchten.

BEARBEITEN:

Von Python3.6, das übersetzt zu:

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

.format ist eine besser lesbare Methode, um mit der Formatierung von Variablen umzugehen:

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

In python 3 wäre dies eine Möglichkeit

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

wenn Sie mehrere Parameter haben, können Sie diese verwenden

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