2012-06-13 13 views
10

tengo la siguiente para dar formato a una cadena:¿Cómo tener cero negativo siempre formateado como cero positivo en una cadena de python?

'%.2f' % n 

Si n es un cero negativo (-0, -0.000 etc) la salida será -0.00.

¿Cómo hago que la salida siempre sea 0.00 para los valores cero negativo y positivo de n?

(Es bastante sencillo de lograr esto, pero no puedo encontrar lo que yo llamaría una manera Pythonic sucinta. Lo ideal sería que hay una cadena de opciones que no soy consciente de formatear.)

+0

[x + (-0) = x] (http://en.wikipedia.org/wiki/Signed_zero# Aritmética) – georg

Respuesta

31

Añadir zer o:

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

que se puede formatear:

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

Esto realmente me hizo reír a carcajadas. Maravilloso. –

+2

En su ejemplo, puede cambiar '0.' a' 0'. – jamylak

+0

@jamylak - tienes razón, puedo. – eumiro

-1

Puede utilizar abs función

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

¿Qué sucede si quiere imprimir '-2.0' y' 0.0' pero no '-0.0'? – jamylak

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

por ejemplo:

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 

razón de la condición if:

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

@jamylak ¡Ah! Me perdí la condición de otro. –

+0

Puede acortarlo a este ''{0: .2f}'.formato (abs (n) si n == 0 else n) ' – jamylak

+0

@jamylak sugerencia implementada. –

2

La forma más sencilla consiste en specialcase cero en su formato:

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

Sin embargo, tenga en cuenta que el método str.format se prefiere más de % sustituciones - la sintaxis en este caso (y en casos más simples) es casi idéntica:

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

También tenga en cuenta que cuanto más concisa a or abs(a) doesn' Parece que, aunque bool(a) es False.

0

Un problema muy relacionado es que -0.00001 también tiene el formato "-0.00". Eso puede ser tan confuso. Las respuestas anteriores no se ocuparán de esto (excepto user278064, que necesita una expresión regular anclada).

Es feo, pero esto es lo mejor que puedo hacer por este caso:

import re 
re.sub (r"^-(0\.?0*)$", r"\1", "%.2f" % number) 
Cuestiones relacionadas