解释Python的str.format中“通用”格式符的行为,左对齐、符号感知零填充。{0:<09.6g}

0 投票
1 回答
533 浏览
提问于 2025-04-18 02:29

有人能解释一下“通用”格式说明符是怎么回事吗?我对左对齐和零填充是怎么一起工作的感到困惑。我不知道这是Python的一个bug,还是我根本不理解文档在说什么。

在下面的输出中,我的困惑主要在最后三个打印块,特别是最右边的那一列。能不能请大家解释一下,参考一下文档中的格式说明,为什么它们会这样输出?

(这是在 Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32 上运行的)

test.py:

t = [8123, 0.0, 1.0, 0.799999, 1.3243423487123]

for v in t:
    print(str.format("{0:9g} {0:9.6g} {0:09.6g} ", v))
print()

for v in t:
    print(str.format("{0:>9g} {0:>9.6g} {0:>09.6g} ", v))
print()

for v in t:
    print(str.format("{0:=9g} {0:=9.6g} {0:=09.6g} ", v))
print()



# What is going on with the right column here???
for v in t:
    print(str.format("{0:<9g} {0:<9.6g} {0:<09.6g} ", v))
print()

# What is going on with the right column here???
for v in t:
    print(str.format("{0:<9,g} {0:<9,.6g} {0:<09,.6g} ", v))
print()


# Preceding the width field by a zero ('0') character enables sign-aware zero-padding for numeric types.
# This is equivalent to a fill character of '0' with an alignment type of '='.
#
# Why doesn't this right column do the same thing as above?
for v in t:
    print(str.format("{0:0=9g} {0:0=9.6g} {0:0=09.6g} ", v))
print()

输出结果是:

$ python3 test.py
     8123      8123 000008123 
        0         0 000000000 
        1         1 000000001 
 0.799999  0.799999 00.799999 
  1.32434   1.32434 001.32434 

     8123      8123 000008123 
        0         0 000000000 
        1         1 000000001 
 0.799999  0.799999 00.799999 
  1.32434   1.32434 001.32434 

     8123      8123 000008123 
        0         0 000000000 
        1         1 000000001 
 0.799999  0.799999 00.799999 
  1.32434   1.32434 001.32434 

8123      8123      812300000 
0         0         000000000 
1         1         100000000 
0.799999  0.799999  0.7999990 
1.32434   1.32434   1.3243400 

8,123     8,123     8,1230000 
0         0         000000000 
1         1         100000000 
0.799999  0.799999  0.7999990 
1.32434   1.32434   1.3243400 

000008123 000008123 000008123 
000000000 000000000 000000000 
000000001 000000001 000000001 
00.799999 00.799999 00.799999 
001.32434 001.32434 001.32434 

1 个回答

0

相关的文档内容如下:

在宽度字段前加一个零('0')字符,可以让数字类型的输出在填充时考虑符号。这就相当于用'0'作为填充字符,并且对齐方式是'='

关于'='对齐选项的文档是:

这个选项会把填充放在符号(如果有的话)后面,但在数字前面。比如说,它会用于打印像+000000120这样的字段。这个对齐选项只适用于数字类型。

<>分别是让给定的项目左对齐和右对齐:

强制字段在可用空间内左对齐(这通常是大多数对象的默认设置)。

强制字段在可用空间内右对齐(这通常是数字的默认设置)。

注意这里使用了“强制”这个词。我认为这意味着如果指定了<,那么输出就会左对齐。就是这么简单。其他隐含的对齐方式不会被考虑(比如说,0填充时隐含的=)。

这就解释了你提供的所有例子:如果你加了<,那么输出就会左对齐,即使使用09.6g,它应该进行零填充。你是不是期待<会被简单忽略呢?我觉得这样想是不太好的,因为<明确的,应该被尊重,而隐含的=应该被覆盖。

我不明白你在最后一个例子中有什么困惑,因为输出确实和第一个输出完全相同,这和上面的文档是一致的。

撰写回答