Python - 使用 format/f 字符串输出带有 0 填充和居中的十六进制数

18

我正尝试以带有0填充的十六进制形式输出一个整数,并使其居中。

data = 10

我可以做其中之一:

'{:#04x}'.format(data) # my attempt at PADDING
'{:^#14x}'.format(data) # Centers Correctly

我无法想到如何将这两个组合起来,我想要的输出是:

0x0a  # centered in a width of 14

1
将数据格式化两次:首先进行填充和十六进制格式化,然后再进行居中处理。我认为这样做会更容易理解正在发生的事情。 - Willem Van Onsem
1
'{:^14s}'.format('{:#04x}'.format(data)) - dawg
1
这让我想起了在模板函数中需要传递字符串填充宽度的需求。虽然这里的解决方案略有不同,但最终使用了相当狡猾的 "{{:>{}.2f}}".format(width).format(num) - Adam Smith
2个回答

27
自从Python 3.6+版本开始,可以使用f字符串来实现:
>>> '{:^14s}'.format(f'0x{data:02x}')
'     0x0a     '

可以(也许滥用地)缩短为:
>>> f'{f"0x{data:02x}":^14}'
'     0x0a     '

也许再直接一点说:
>>> f'{format(data, "#04x"):^14}'
'     0x0a     '

使用Python<3.6版本:
>>> '{:^14s}'.format('{:#04x}'.format(data))
'     0x0a     '

1
或许(有点恶意地 ;)) - Adam Smith
2
嵌套的f字符串是否有意义存在还有待商榷,但这是一个很好的使用示例。 - dawg
@IceflowerS:我刚刚在Python 3.10上重新测试了所有四个示例,它们都产生了所描述的输出。你说的“这不起作用”是什么意思? - dawg
MacOS Python 3.10.0于2021年10月22日发布。该字符串 >>> '{:^14s}'.format(f'{data:#02x}') 会生成 ' 0xa '。也许可以尝试将其分解为组成部分?例如,'{:^14s}'.format("X") 会发生什么? - dawg
@IceflowerS:不知道如何对我无法重现的东西进行评论。它在MacOS和Linux上使用Python 3.8-3.10可以正常工作。 - dawg
显示剩余2条评论

4

这个方法有点丑,但是可以正常工作:

'{:^14}'.format('{:#04x}'.format(data))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接