首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python的“通用”说明符的str.format解释这种行为,左对齐的符号感知的零填充。{0:<09.6g}

用Python的“通用”说明符的str.format解释这种行为,左对齐的符号感知的零填充。{0:<09.6g}
EN

Stack Overflow用户
提问于 2014-04-12 20:04:31
回答 1查看 400关注 0票数 0

有人能解释一下“通用”格式说明符是如何工作的吗?我搞不懂左对齐和0填充是如何工作的。我不知道这是不是python中的一个bug,或者我只是不理解文档在说什么。

在下面的输出中,我的困惑是在打印输出的最后3个块中,特别是最右边的列。有人能解释一下,参考文档中的格式规范,为什么它们会这样输出吗?

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

test.py:

代码语言:javascript
复制
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()

它的输出是:

代码语言:javascript
复制
$ 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 
EN

回答 1

Stack Overflow用户

发布于 2014-04-12 23:49:20

相关文档如下:

在宽度字段之前加上零('0')字符的

可为数值类型启用符号感知的零填充。这等效于对齐类型为'0' '='**.**的的字符

其中,'=' align选项的文档为:

强制将填充放在符号(如果有)之后但在数字之前。这用于打印表单+000000120中的字段。此对齐选项仅对数值类型有效。

<>分别左对齐和右对齐给定项:

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

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

注意动词force的用法。我相信这里说明的是,如果指定了<,则输出是左对齐的。句号。不考虑其他隐含对齐(例如,0填充所隐含的= )。

这解释了您提供的所有示例:如果您放置一个<,那么即使使用09.6g,输出也是左对齐的,它应该进行零填充。你有没有料到<会被忽略?我认为这将是一个糟糕的选择,因为既然<是显式的,那么它就应该被尊重,而隐式的=应该被覆盖。

我不明白最后一个示例中让您困惑的是什么,因为输出完全等同于第一个输出,这与上面的文档是一致的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23030141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档