解释Python的str.format中“通用”格式符的行为,左对齐、符号感知零填充。{0:<09.6g}
有人能解释一下“通用”格式说明符是怎么回事吗?我对左对齐和零填充是怎么一起工作的感到困惑。我不知道这是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
,它应该进行零填充。你是不是期待<
会被简单忽略呢?我觉得这样想是不太好的,因为<
是明确的,应该被尊重,而隐含的=
应该被覆盖。
我不明白你在最后一个例子中有什么困惑,因为输出确实和第一个输出完全相同,这和上面的文档是一致的。