首页 > 解决方案 > #X 格式说明符真的应该使“0x”前缀大写吗?

问题描述

我正在尝试使用#X格式说明符来打印使用大写字母作为“数字”的十六进制值,同时自动添加通常的0x前缀。例如,十进制10应表示为0xA

但是,该说明符似乎并没有以这种方式表现:

>>> print(f'{10:#X}')
0XA
>>> '{:#X}'.format(10)
'0XA'

看起来X修饰符使数字的整个字符串表示形式(包括0x前缀)通过str.upper而不是仅通过“数字部分”。我认为这很公平,但是在检查了Format Specification Mini-Language之后,它看起来可能不是预期的结果(或者,至少没有明确记录)。以下是相关位:

'#'选项导致使用“替代形式”进行转换。[...] 对于整数,当使用 [...] 十六进制输出时,此选项将前缀 [...] 添加'0x'到输出值。

[...]

可用的整数表示类型有:

类型 意义
[...] [...]
'x' 十六进制格式。输出以 16 为基数的数字,对 9 以上的数字使用小写字母。
'X' 十六进制格式。输出以 16为底的数字,对 9 以上的数字使用大写字母
[...] [...]

这似乎意味着大写字母只能用于非十进制的十六进制数字(a, b, c, d, e, f),因此不应该关注x(from 0x);那正确吗?

标签: python

解决方案


正如您已经注意到的,#X 使所有内容都大写,#x 使所有内容小写。如果您希望 0x 较低而其余部分为大写,则可以尝试以下操作:

# will print 0xA
print(f'{10:#X}'.replace('0X', '0x'))

在我看来,将 0x 中的 x 大写是愚蠢的,他们不应该以这种方式实现它,但它就是这样......

编辑: 您可以删除 # 然后它将完全删除 0x,然后您可以在格式字符串中手动添加 0x,这是我认为最好的方法:

print(f"0x{10:X}")

推荐阅读