使用固定长度和空间填充格式化整数的正确方法

moo*_*eep 4 python string-formatting

我有0到100(包括)100范围内的整数.我想将它们转换为固定长度为3的字符串,空格填充和右对齐.

我尝试使用以下格式字符串,但它为三位数字添加了另一个空格,这使得它们的长度为4而不是3.

fmt = lambda x: "{: 3d}".format(x)
[fmt(99), fmt(100)] # produces [' 99', ' 100'] instead of [' 99', '100']
Run Code Online (Sandbox Code Playgroud)

有趣的是,当使用零填充时,它按预期工作:

fmt = lambda x: "{:03d}".format(x) 
[fmt(99), fmt(100)] # produces ['099', '100'] as expected
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我怎样才能解决这个问题?

我真的需要先转换为字符串吗?

fmt = lambda x: "{:>3s}".format(str(x))
[fmt(99), fmt(100)] # produces [' 99', '100'] as expected
Run Code Online (Sandbox Code Playgroud)

Eug*_*ash 10

默认情况下,数字在右侧对齐并在格式化时用空格填充,因此您应该只指定宽度:

>>> '{:3d}'.format(99)
' 99'
>>> '{:3d}'.format(100)
'100'
Run Code Online (Sandbox Code Playgroud)

或者,您可以指定填充字符和对齐方式:

>>> '{: >3d}'.format(99)
' 99'
>>> '{: >3d}'.format(100)
'100'
Run Code Online (Sandbox Code Playgroud)

但是,宽度之前的单个空格被视为符号选项.引用文档:

sign选项仅对数字类型有效,可以是以下之一:

'+'表示标志应该用于正数和负数.
'-'表示标志应仅用于负数(这是默认行为).
' '表示应在正数上使用前导空格,在负数上使用减号.

这就是为什么"{: 3d}"在示例中使用前导空格进行格式化的原因.