格式化具有固定长度和 space 填充的整数的正确方法
Correct way to format integers with fixed length and space padding
我有 0 到(包括)100 范围内的整数。我想将它们转换为固定长度为 3 的字符串,并使用 space 填充和右对齐。
我尝试使用以下格式字符串,但它为三位数字添加了另一个 space,这使得它们的长度为 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
默认情况下,数字向右对齐并在格式化时用 space 填充,因此您只需指定 width:
>>> '{:3d}'.format(99)
' 99'
>>> '{:3d}'.format(100)
'100'
或者,您可以同时指定 fill 字符和 alignment:
>>> '{: >3d}'.format(99)
' 99'
>>> '{: >3d}'.format(100)
'100'
但是,宽度前的单个 space 被视为 sign 选项。引用 documentation:
The sign option is only valid for number types, and can be one of the
following:
'+'
indicates that a sign should be used for both positive as well as
negative numbers.
'-'
indicates that a sign should be used only for negative numbers
(this is the default behavior).
' '
indicates that a leading space
should be used on positive numbers, and a minus sign on negative
numbers.
这就是为什么 "{: 3d}"
在您的示例中使用前导 space 格式的原因。
您不需要转换为字符串,上面代码的问题是您使用了 "{: 3d}".format(x)
而不是 "{:3d}".format(x)
fmt = lambda x: "{:3d}".format(x)
[fmt(99), fmt(100)] #produces [' 99', '100']
它不适用于数字的原因是因为 space 被认为是符号字符。
Indicates that a leading space should be used on positive numbers, and
a minus sign on negative numbers.
因此您的数字中始终有前导 space。
另一方面,填充值需要首先指定对齐值:
If a valid align value is specified, it can be preceded by a fill
character that can be any character and defaults to a space if
omitted.
但它适用于 '0'
没有对齐值的情况,因为它是一种特殊情况:
When no explicit alignment is given, 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 '='.
但不适用于其他填充值:
>>> '{:*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'
因此在您的情况下,由于默认填充值为 space 您可以简单地删除它以防止指定对齐方式:
>>> '{:3d}'.format(99)
' 99'
>>> '{:3d}'.format(100)
'100'
# With alignment and fill character
>>> '{: =3d}'.format(99)
' 99'
>>> '{: =3d}'.format(100)
'100'
我有 0 到(包括)100 范围内的整数。我想将它们转换为固定长度为 3 的字符串,并使用 space 填充和右对齐。
我尝试使用以下格式字符串,但它为三位数字添加了另一个 space,这使得它们的长度为 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
默认情况下,数字向右对齐并在格式化时用 space 填充,因此您只需指定 width:
>>> '{:3d}'.format(99)
' 99'
>>> '{:3d}'.format(100)
'100'
或者,您可以同时指定 fill 字符和 alignment:
>>> '{: >3d}'.format(99)
' 99'
>>> '{: >3d}'.format(100)
'100'
但是,宽度前的单个 space 被视为 sign 选项。引用 documentation:
The sign option is only valid for number types, and can be one of the following:
'+'
indicates that a sign should be used for both positive as well as negative numbers.
'-'
indicates that a sign should be used only for negative numbers (this is the default behavior).
' '
indicates that a leading space should be used on positive numbers, and a minus sign on negative numbers.
这就是为什么 "{: 3d}"
在您的示例中使用前导 space 格式的原因。
您不需要转换为字符串,上面代码的问题是您使用了 "{: 3d}".format(x)
而不是 "{:3d}".format(x)
fmt = lambda x: "{:3d}".format(x)
[fmt(99), fmt(100)] #produces [' 99', '100']
它不适用于数字的原因是因为 space 被认为是符号字符。
Indicates that a leading space should be used on positive numbers, and a minus sign on negative numbers.
因此您的数字中始终有前导 space。
另一方面,填充值需要首先指定对齐值:
If a valid align value is specified, it can be preceded by a fill character that can be any character and defaults to a space if omitted.
但它适用于 '0'
没有对齐值的情况,因为它是一种特殊情况:
When no explicit alignment is given, 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 '='.
但不适用于其他填充值:
>>> '{:*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'
因此在您的情况下,由于默认填充值为 space 您可以简单地删除它以防止指定对齐方式:
>>> '{:3d}'.format(99)
' 99'
>>> '{:3d}'.format(100)
'100'
# With alignment and fill character
>>> '{: =3d}'.format(99)
' 99'
>>> '{: =3d}'.format(100)
'100'