如何在Python中将浮点数格式化为固定宽度

491

我该如何将浮点数格式化为固定宽度,并满足以下要求:

  1. 如果n < 1,则应添加前导零
  2. 添加尾部小数零以填补固定宽度
  3. 截断超出固定宽度的小数位数
  4. 对齐所有小数点

例如:

% formatter something like '{:06}'
numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print formatter.format(number)

输出的结果将会像这样

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000
10个回答

697
numbers = [23.23, 0.1233, 1.0, 4.223, 9887.2]                                                                                                                                                   
                                                                                                                                                                                                
for x in numbers:                                                                                                                                                                               
    print("{:10.4f}".format(x)) 

打印

   23.2300
    0.1233
    1.0000
    4.2230
 9887.2000

大括号内的格式说明符遵循Python格式化字符串语法。在这种情况下,具体包括以下几个部分:

  • 冒号前面的空字符串表示“取下一个提供给format()的参数” - 在本例中只有x作为唯一的参数。
  • 冒号后面的10.4f部分是格式规范
  • f表示定点表示法。
  • 10是正在打印的字段的总宽度,左侧用空格填充。
  • 4是小数点后的数字位数。

13
我理解4f代表将小数限制为4位(带有尾随的零),但是10代表什么意思?这是否意味着此格式化不适用于大于9999999999(十个9)的整数?只是好奇。 - hobbes3
66
“10.4”表示宽度为10个字符,精度为小数点后4位。 - MRAB
15
10是最小字段宽度,即打印字符串的最小长度。数字默认为右对齐并用空格填充--有关更多详细信息,请参见文档 - Sven Marnach
9
对于Python 2.7之前的版本:("%0.4f" % x).rjust(10) - Steven Rumbalski
23
或者直接使用 "%10.4f" % x。在Python 2.6中,您还可以使用"{0:10.4f}".format(x) - Sven Marnach
显示剩余8条评论

230

这个问题的回答已经有几年了,但是从Python 3.6开始 (PEP498),你可以使用新的f-strings

numbers = [23.23, 0.123334987, 1, 4.223, 9887.2]

for number in numbers:
    print(f'{number:9.4f}')

打印:

  23.2300
   0.1233
   1.0000
   4.2230
9887.2000

10
请注意,宽度也包括点字符。因此,如果您指定宽度为9,则有1个用于打印小数点,另外8个用于打印数字和空格。 - off99555

50

在Python3中,以下内容有效:

>>> v=10.4
>>> print('% 6.2f' % v)
  10.40
>>> print('% 12.1f' % v)
        10.4
>>> print('%012.1f' % v)
0000000010.4

1
在过去的4年中,这种情况已经发生了变化,现在格式化是最古老的格式化方法。由于几个原因,使用str.formatf-strings更受欢迎。以前只有str.format时,人们有一些理由,但f-strings解决了这个问题。格式化迷你语言文档来自文档的str.format示例文档中的f-string文字示例 - ninMonkey

14
使用 f-string 字面量
>>> number = 12.34
>>> print(f"{number}")
12.34
>>> print(f"{number:10f}")
 12.340000
>>> print(f"{number:10.4f}")
   12.3400
< p > 冒号 < code > : 之后的< code >10.4f是 格式规范, 其中10是整个数字(包括空格)的字符宽度,第二个数字4是小数点后的位数,< code >f代表浮点数。

也可以使用变量来代替硬编码宽度和小数位数:

>>> number = 12.34
>>> width = 10
>>> decimals = 4
>>> print(f"{number:{width}.{decimals}f}")
   12.3400

为什么 "print(f"{number:5f}")" 不按预期工作呢?它输出了9个字符 ("12.340000")。看起来9是最小宽度?但是为什么呢?与此同时,添加小数点后的数字位数 (5.2f) 按预期打印了一个5个字符的字符串。 - undefined
1
根据f类型的文档,"如果没有给出精度,则浮点数默认使用小数点后6位的精度。"所以print(f"number:99f")将打印一个至少有99个空格宽度的数字,默认为六位小数,因为只给出了宽度,没有给出精度。 - undefined

13

您还可以使用零填充进行左填充。例如,如果您想要number的长度为9个字符,并在左侧用零填充,则使用:

print('{:09.3f}'.format(number))

因此,如果number = 4.656,输出为:00004.656

对于您的示例,输出将如下所示:

numbers  = [23.2300, 0.1233, 1.0000, 4.2230, 9887.2000]
for x in numbers: 
    print('{:010.4f}'.format(x))

输出:

00023.2300
00000.1233
00001.0000
00004.2230
09887.2000

一个例子是当您想按字母顺序正确列出文件名时,可能会很有用。我注意到在一些Linux系统中,数字的顺序是:1、10、11、..2、20、21、...

因此,如果您想强制执行文件名的必要数字顺序,您需要使用适当数量的零进行左填充。


12

请参阅 Python 3.x 的 格式化字符串语法

IDLE 3.5.1   
numbers = ['23.23', '.1233', '1', '4.223', '9887.2']

for x in numbers:  
    print('{0: >#016.4f}'. format(float(x)))  

     23.2300
      0.1233
      1.0000
      4.2230
   9887.2000

10

这将打印76.66

print("Number: ", f"{76.663254: .2f}")

4
在Python 3中。
GPA = 2.5
print(" %6.1f " % GPA)

6.1f表示小数点后保留1位数字,如果你要打印小数点后2位数字,则只需要%6.2f,这样%6.3f就会打印出小数点后3位数字。


1

我需要类似于数组的东西。那对我很有帮助。

some_array_rounded=np.around(some_array, 5)

-1

我尝试了所有的选项,例如:

  1. pd.options.display.float_format = '{:.4f}'.format
  2. pd.set_option('display.float_format', str)
  3. pd.set_option('display.float_format', lambda x: f'%.{len(str(x%1))-2}f' % x)
  4. pd.set_option('display.float_format', lambda x: '%.3f' % x)

但对我都不起作用。

所以,在将变量/值(var1)赋给一个变量(比如说 num1)时,我使用了 round(val,5),例如:

num1 = round(var1,5)

这是一种粗糙的方法,因为您必须在每个任务中使用此round函数。但这确保了您对其发生方式的控制,并获得您想要的结果。


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