Python-Dezimalformat

73

WAS ist ein guter Weg, um eine Python-Dezimalstelle so zu formatieren?

1,00 -> '1'
1,20 -> '1,2'
1,23 -> '1,23'
1,234 -> '1,23'
1,2345 -> '1,23'

Juanefren
quelle
1
Wenn Sie Decimal und nicht float verwenden, sollten Sie sich auch stackoverflow.com/questions/11227620/… ansehen . {:g}schneidet keine unbedeutenden Nullen von Dezimalstellen ab.
Pankrat

Antworten:

118

Wenn Sie Python 2.6 oder neuer haben, verwenden Sie format:

'{0:.3g}'.format(num)

Für Python 2.5 oder älter:

'%.3g'%(num)

Erläuterung:

{0}weist formatan, das erste Argument zu drucken - in diesem Fall num.

Alles nach dem Doppelpunkt (:) gibt das an format_spec.

.3 setzt die Genauigkeit auf 3.

gEntfernt unbedeutende Nullen. Siehe http://en.wikipedia.org/wiki/Printf#fprintf

Zum Beispiel:

tests=[(1.00, '1'),
       (1.2, '1.2'),
       (1.23, '1.23'),
       (1.234, '1.23'),
       (1.2345, '1.23')]

for num, answer in tests:
    result = '{0:.3g}'.format(num)
    if result != answer:
        print('Error: {0} --> {1} != {2}'.format(num, result, answer))
        exit()
    else:
        print('{0} --> {1}'.format(num,result))

ergibt

1.0 --> 1
1.2 --> 1.2
1.23 --> 1.23
1.234 --> 1.23
1.2345 --> 1.23

Mit Python 3.6 oder neuer können Sie Folgendes verwenden f-strings:

In [40]: num = 1.234; f'{num:.3g}'
Out[40]: '1.23'
unutbu
quelle
17
Es scheint, dass dies Python 2.7 veranlasst, in die wissenschaftliche Notation für größere Zahlen zu wechseln: >>> "{0: .3g}". Format (100.20) '100' >>> "{0: .3g}". Format (1001.20 ) '1e + 03'
vdboor
4
Also, wie man nein setzt Exponent notation. Als {:,2f}.format(number)Dosis, entfernt aber auch unbedeutende Nullen
Aylwyn Lake
1
@unutbu - Irgendeine Idee, wie man '{0: .3g}' für Python fStrings zum Laufen bringt?
Scott Skiles
1
@ScottSkiles: Gibt num=1.2345; f'{num:.3g}'zurück '1.23'. Siehe diese Erklärung der Codeäquivalenz .
Unutbu
Genial! Lohnt sich eine Bearbeitung dieser Antwort? Ich habe das woanders auf SO gefunden.
Scott Skiles
25

Nur der erste Teil von Justins Antwort ist richtig. Die Verwendung von "% .3g" funktioniert nicht in allen Fällen, da .3 nicht die Genauigkeit, sondern die Gesamtzahl der Ziffern ist. Versuchen Sie es für Zahlen wie 1000.123 und es bricht.

Also würde ich verwenden, was Justin vorschlägt:

>>> ('%.4f' % 12340.123456).rstrip('0').rstrip('.')
'12340.1235'
>>> ('%.4f' % -400).rstrip('0').rstrip('.')
'-400'
>>> ('%.4f' % 0).rstrip('0').rstrip('.')
'0'
>>> ('%.4f' % .1).rstrip('0').rstrip('.')
'0.1'
blackdaemon
quelle
14

Hier ist eine Funktion, die den Trick macht:

def myformat(x):
    return ('%.2f' % x).rstrip('0').rstrip('.')

Und hier sind Ihre Beispiele:

>>> myformat(1.00)
'1'
>>> myformat(1.20)
'1.2'
>>> myformat(1.23)
'1.23'
>>> myformat(1.234)
'1.23'
>>> myformat(1.2345)
'1.23'

Bearbeiten:

Als ich mir die Antworten anderer Leute ansah und experimentierte, stellte ich fest, dass g das ganze Strippen für Sie erledigt. Damit,

'%.3g' % x

funktioniert auch hervorragend und unterscheidet sich geringfügig von dem, was andere Leute vorschlagen (mit '{0: .3}'. format () Zeug). Ich denke, treffen Sie Ihre Wahl.

Justin Peel
quelle
Nett. Viel sauberer als meine.
Mike Cialowicz
4
Wenn Sie so etwas wie 0,0000005 bekommen, obwohl ich glaube, dass '% .3g'% x Ihnen Exponenten geben wird?
Teuer
4

Verwenden Sie einfach Pythons Standard- Formatierungsmethoden für Zeichenfolgen :

>>> "{0:.2}".format(1.234232)
'1.2'
>>> "{0:.3}".format(1.234232)
'1.23'

Wenn Sie eine Python-Version unter 2.6 verwenden, verwenden Sie

>>> "%f" % 1.32423
'1.324230'
>>> "%.2f" % 1.32423
'1.32'
>>> "%d" % 1.32423
'1'
Esteban Küber
quelle
2
Dies ist keine allgemeine Lösung und funktioniert nicht für Zahlen mit nachgestellten Nullen.
Mike Cialowicz