33

I have the following to format a string:

'%.2f' % n

If n is a negative zero (-0, -0.000 etc) the output will be -0.00.

How do I make the output always 0.00 for both negative and positive zero values of n?

(It is fairly straight forward to achieve this but I cannot find what I would call a succinct pythonic way. Ideally there is a string formatting option that I am not aware of.)

Dan
  • 4,578
  • 5
  • 29
  • 52

5 Answers5

85

Add zero:

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

which you can format:

>>> '{0:.3f}'.format(a + 0)
'0.000'
eumiro
  • 194,053
  • 32
  • 286
  • 259
6

A very closely related problem is that -0.00001 is also formatted as "-0.00". That can be just as confusing. The answers above will not take care of this (except for user278064's, which needs an anchored regexp).

It's ugly, but this is the best I can do for this case:

import re
re.sub (r"^-(0\.?0*)$", r"\1", "%.2f" % number)
Tim Adye
  • 81
  • 1
  • 2
  • if round(v * 1000) == 0: v= 0.0 – Tatarize Sep 27 '19 at 14:34
  • For my example, I guess you mean `v*100`. Maybe a simpler version is: `if round(v,2) == 0: v= 0.0` . The problem is that this changes the value of v after the print, which is not good. So how about: `"%.2f" % (0.0 if round(v,2) == 0 else v)` . – Tim Adye Sep 30 '19 at 10:41
2

The most straightforward way is to specialcase zero in your format:

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

However, do note that the str.format method is preferred over % substitutions - the syntax in this case (and in most simple cases) is nearly identical:

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

Also note that the more concise a or abs(a) doesn't seem to - even though bool(a) is False.

lvc
  • 32,767
  • 9
  • 68
  • 96
1
import re
re.sub("[-+](0\.0+)", r"\1", number)

e.g.:

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

reason for the if condition:

>>> -0.0000==0
True
>>> 0.000==0
True
>>> 0.0==0
True
Ashwini Chaudhary
  • 232,417
  • 55
  • 437
  • 487