使用前导零格式化包含小数点的数字

13

我希望将一个带有小数点的数字格式化,并在其前面添加前导零。

这样做的方法是:

>>> '3.3'.zfill(5)
003.3

Python是否有只考虑整数部分而不包括小数位的函数?

我只需要格式化简单数字,最多只有五位小数。另外,使用%5f似乎会考虑尾随零而不是前导零。


你试过使用 %5.1f 吗?如果是的话,有什么问题吗? - S.Lott
1
它用空格填充字符串,仍然考虑小数点及其后面的所有内容。 - 3eee3
6个回答

30

这是你要找的吗?

>>> "%07.1f" % 2.11
'00002.1'

根据您的评论,我可以得出以下代码(尽管不再那么优雅):

>>> fmt = lambda x : "%04d" % x + str(x%1)[1:]
>>> fmt(3.1)
0003.1
>>> fmt(3.158)
0003.158

17

我喜欢新的格式风格。

loop = 2
pause = 2
print 'Begin Loop {0}, {1:06.2f} Seconds Pause'.format(loop, pause)
>>>Begin Loop 2, 0002.1 Seconds Pause

在 {1:06.2f}:

  • 1 是变量暂停的占位符
  • 0 指示填充前导零
  • 6 总字符数,包括小数点
  • 2 精度
  • f 将整数转换为浮点数

完美运行!只需针对Python 3进行小改动即可。 - Royi

5
print('{0:07.3f}'.format(12.34))

此值共有7个字符,包括3个小数点,即“012.340”


4
像这样吗?
>>> '%#05.1f' % 3.3
'003.3'

它仍然考虑小数部分,并截断第一个小数位之后的任何内容。 - 3eee3
因此,请考虑小数位数,并将它们添加到十进制数字说明符中。 - Santa

3

如果你的例子是一个字符串,你可以编写以下的小函数来完成你想要的操作:

def zpad(val, n):
    bits = val.split('.')
    return "%s.%s" % (bits[0].zfill(n), bits[1])

>>> zpad('3.3', 5)
'00003.3'

1
这正是我不想做的事情,但如果没有内置函数,我想它会起作用。谢谢。 - 3eee3
1
@3ee3 在 '3' 上尝试一下。如果你想要一个既适用于 int 又适用于 float 的版本,在 return 之前添加一行 bits[0] = bits[0].zfill(n),并将 return 改为 return bits = '.'.join(bits) - agf
-3.3 怎么办?没有产生预期的结果!!添加一个条件 if val.count('-')>0: n=n+1,那么它也可以工作。 - Asif Ali

0

使用Python 3.6+,你可以使用fstring方法:

f'{3.3:.0f}'[-5:]
>>> '3'

f'{30000.3:.0f}'[-5:]
>>> '30000'

这个方法将消除小数部分(只考虑整数部分),并返回最多5位数字。有两个注意点:首先,如果整数部分大于5位,则超过5位的最高有效数字将被删除。 其次,如果小数部分大于0.5,则函数将向上舍入。

f'{300000.51:.0f}'[-5:]
>>>'00001'

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