格式化具有固定长度和空格填充的整数的正确方法

时间:2017-08-17 09:51:29

标签: 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']

有趣的是,当使用零填充时,它可以正常工作:

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

这是为什么?我该如何解决这个问题?

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

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

3 个答案:

答案 0 :(得分:7)

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

>>> '{:3d}'.format(99)
' 99'
>>> '{:3d}'.format(100)
'100'

或者,您可以同时指定 fill 字符和对齐

>>> '{: >3d}'.format(99)
' 99'
>>> '{: >3d}'.format(100)
'100'

然而,宽度之前的单个空格被视为符号选项。引用documentation

  

符号选项仅对数字类型有效,可以是其中之一   以下内容:

     

'+'表示标志应该既用于正面也用于   负数。
  '-'表示标志只能用于负数   (这是默认行为)   ' '表示领先的空间   应该用于正数,减号用于负数   号。

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

答案 1 :(得分:2)

它不适用于数字的原因是因为空间被视为符号字符。

  

表示应在正数上使用前导空格,和   负数上的减号。

因此,你的数字总是领先的空间。

另一方面,填充值需要首先指定对齐值:

  

如果指定了有效的对齐值,则可以在其前面填充   可以是任何字符的字符,如果是,则默认为空格   删去。

但它适用于'0'没有对齐值的情况,因为它是一个特殊情况:

  

当没有给出明确的对齐时,在宽度字段之前用a   零(' 0')字符为数字启用符号感知零填充   类型。这相当于' 0'的填充字符。对齐   类型为' ='。

但不会为其他填充值工作:

>>> '{:*5d}'.format(100)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-10-559a168f3704> in <module>()
----> 1 '{:*5d}'.format(100)

ValueError: Invalid format specifier
>>> '{:*=5d}'.format(100)
'**100'

因此,在您的情况下,由于默认填充值是空格,您可以简单地删除它以防止指定对齐:

>>> '{:3d}'.format(99)
' 99'    
>>> '{:3d}'.format(100)
'100'

# With alignment and fill character

>>> '{: =3d}'.format(99)
' 99'    
>>> '{: =3d}'.format(100)
'100'

答案 2 :(得分:0)

您无需转换为字符串,上述代码的问题是您使用"{: 3d}".format(x)代替"{:3d}".format(x)

   fmt = lambda x: "{:3d}".format(x)
   [fmt(99), fmt(100)] #produces [' 99', '100']