2010-03-05 6 views
42

WHat ist eine gute Möglichkeit, eine Python-Dezimalzahl wie folgt zu formatieren?Python-Dezimalen-Format

1.00 -> '1'
1.20 -> '1.2'
1.23 -> '1.23'
1.234 -> '1.23'
1,2345 -> '1.23'

+1

Wenn Konvertierung in einen String? –

+0

Ja, Umwandlung in eine Zeichenfolge. – juanefren

+1

Wenn Sie Dezimal verwenden und nicht schweben, können Sie auch http://StackOverflow.com/Questions/11227620/dros-trailing-zeros-from-decimal sehen. '{: g}' hackt nicht unbedeutende Nullen von Dezimalzahlen ab. – Pankrat

Antwort

80

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}format das erste Argument drucken erzählt - - in diesem Fall num.

Alles nach dem Doppelpunkt (:) gibt format_spec an.

.3 setzt die Präzision 3.

g unbedeutend Nullen entfernt. 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 
+14

Es scheint, dass Python 2.7 in die wissenschaftliche Notation für größere Zahlen geht: >>> "{0: .3g}". Format (100.20) '100' >>> "{0: .3g}" .format (1001.20) '1e + 03' – vdboor

+3

Also, wie man keine 'Exponent-Notation' setzt. Als '{:, 2f} .format (Anzahl)' Dosis, aber auch unwichtige Nullen entfernt –

3

verwenden Sie einfach Pythons Standard string formatting methods:

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

Wenn Sie eine Python-Version unter 2.6 verwenden, verwenden

>>> "%f" % 1.32423 
'1.324230' 
>>> "%.2f" % 1.32423 
'1.32' 
>>> "%d" % 1.32423 
'1' 
+1

Dies ist keine allgemeine Lösung und funktioniert nicht für Zahlen mit abschließenden Nullen. –

9

Hier ist eine Funktion, die den Trick tun:

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' 

Edit:

Von anderen Leuten Antworten zu suchen und zu experimentieren, Ich habe festgestellt, dass ich all das Strippen für dich erledigt habe. So

'%.3g' % x 

funktioniert hervorragend zu und ist etwas anders aus, was andere Leute darauf hindeutet (mit '{0: 0,3}' format() Sachen.). Ich nehme an, du entscheidest dich.

+0

Schön. Viel sauberer als meins. –

+3

Wenn Sie etwas wie 0,0000005 bekommen, obwohl ich glaube, dass '% .3g'% x beginnt, Ihnen Exponenten zu geben? – PriceChild

18

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

Also, ich würde verwenden, was Justin ist darauf hindeutet:

>>> ('%.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'