2012-06-13 9 views
10

Mam następujący sformatować ciąg:Jak mieć ujemne zero zawsze sformatowane jako dodatnie zero w ciągu Pythona?

'%.2f' % n 

Jeśli n jest ujemne zero (-0, -0.000 etc) wyjście będzie -0.00.

Jak ustawić wyjściowy zawsze 0.00 dla ujemnych i dodatnich wartości zerowych n?

(Jest to dość proste do osiągnięcia tego celu, ale nie mogę znaleźć to, co nazwałbym zwięzłą pythonic sposób. Idealnie jest ciągiem opcję, że nie jestem świadomy formatowania.)

+0

[x + (-0) = X], (http://en.wikipedia.org/wiki/Signed_zero# Arytmetyka) – georg

Odpowiedz

31

Dodaj Zer O:

>>> a = -0.0 
>>> a + 0 
0.0 

który można sformatować:

>>> '{0:.3f}'.format(a + 0) 
'0.000' 
+14

To naprawdę mnie rozśmieszyło. Wspaniale. –

+2

W twoim przykładzie możesz zmienić "0" na "0". – jamylak

+0

@jamylak - masz rację, mogę. – eumiro

-1

Można użyć abs funkcji

In [27]: abs(-0) 
Out[27]: 0 

In [28]: abs(-1) 
Out[28]: 1 

In [29]: abs(-2) 
Out[29]: 2 

In [30]: abs(-2) == -2 
Out[30]: False 

In [31]: abs(-2) == 2 
Out[31]: True 
+7

Co jeśli chce wydrukować "-2.0" i "0.0", ale nie "-0.0"? – jamylak

1
import re 
re.sub("[-+](0\.0+)", r"\1", number) 

np

re.sub("[-+](0\.0+)", r"\1", "-0.0000") // "0.0000" 
re.sub("[-+](0\.0+)", r"\1", "+0.0000") // "0.0000"  
1
>>> x= '{0:.2f}'.format(abs(n) if n==0 else n) 
>>> print(x) 
0.00 

przyczynę stanu if:

>>> -0.0000==0 
True 
>>> 0.000==0 
True 
>>> 0.0==0 
True 
+0

@jamylak Ah! Brakowało mi warunku innego. –

+0

Możesz go skrócić do tego ''{0: .2f}'.format (abs (n), jeśli n == 0 else n) ' – jamylak

+0

Sugestia @jamylak została zaimplementowana. –

2

Najprostszym sposobem jest specialcase zera w formacie:

>>> a = -0.0 
>>> '%.2f' % (a if a != 0 else abs(a)) 
0.0 

Jednak należy pamiętać, że metoda str.format jest korzystniejszy % Zastępstwa - Składnia w tym przypadku (iw większości prostych przypadkach) jest prawie identyczna:

>>> '{:.2f}'.format(a if a != 0 else abs(a)) 

Należy również pamiętać, że im bardziej zwięzły a or abs(a) robi” zdaje się - nawet jeśli bool(a) jest False.

0

Bardzo blisko spokrewniony problem polega na tym, że -0.00001 jest również sformatowany jako "-0.00". To może być tak samo mylące. Powyższe odpowiedzi nie zajmą się tym (z wyjątkiem user278064, który wymaga zakotwiczonego regexp).

jest brzydki, ale najlepiej można to zrobić w tym przypadku:

import re 
re.sub (r"^-(0\.?0*)$", r"\1", "%.2f" % number) 
Powiązane problemy