如何在Python字符串中将负零始终格式化为正零?

39

我有以下代码用于格式化字符串:

'%.2f' % n
如果 n 是负零 (-0, -0.000 等),输出将是 -0.00
如何让输出在 n 为正零或负零时都为 0.00
(实现这个很简单,但我找不到一种我认为简洁的 pythonic 方式。理想情况下,有一种字符串格式选项我不知道。)

[x + (-0) = x](http://en.wikipedia.org/wiki/Signed_zero#Arithmetic) - georg
2
https://peps.python.org/pep-0682/ 已添加到 Python 3.11。 - Neil G
5个回答

98

添加0:

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

你可以进行格式化:

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

37
这实际上让我大声笑出来了。太好了。 - Tim Pietzcker
2
在你的例子中,你可以将 0. 改为 0 - jamylak
10
太棒了。尽管我确信会有人使用这个技巧来阅读一些代码,并会想:“他为什么要在所有的浮点数上加零呢?!” - LeartS

8
一个非常相关的问题是,-0.00001也被格式化为“-0.00”,这同样令人困惑。以上的答案都没有解决这个问题(除了user278064的答案,它需要一个锚定的正则表达式)。
虽然不太美观,但这是我能为这种情况做的最好的事情:
import re
re.sub (r"^-(0\.?0*)$", r"\1", "%.2f" % number)

如果round(v * 1000) == 0: v= 0.0 - Tatarize
对于我的例子,我猜你是指 v*100。也许一个简化的版本是:if round(v,2) == 0: v = 0.0。问题是这会改变打印后的v值,这不太好。那么可以这样处理: "%.2f" % (0.0 if round(v,2) == 0 else v) - Tim Adye

3
最简单的方法是在格式中特殊处理零:
>>> a = -0.0
>>> '%.2f' % ( a if a != 0 else abs(a) )
0.0

然而,需要注意的是,在使用%进行字符串替换时,更推荐使用str.format方法 - 在这种情况下(以及大多数简单情况下)语法几乎相同:

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

还要注意的是,更简洁的a or abs(a)似乎不起作用 - 即使bool(a)False


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"    

1
>>> x= '{0:.2f}'.format(abs(n) if n==0 else n)
>>> print(x) 
0.00

if 条件语句的原因:

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

@jamylak 啊!我错过了 else 条件。 - Ashwini Chaudhary
你可以将其缩短为'{0:.2f}'.format(abs(n) if n==0 else n) - jamylak
@jamylak的建议已经实现。 - Ashwini Chaudhary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接