【问题标题】:How can I get Python to use upper case letters when printing hexadecimal values?打印十六进制值时,如何让 Python 使用大写字母?
【发布时间】:2012-11-07 20:14:07
【问题描述】:

在 Python v2.6 中,我可以通过以下两种方式之一获取整数的十六进制:

print(("0x%x")%value)
print(hex(value))

但是,在这两种情况下,十六进制数字都是小写的。我怎样才能得到这些大写?

【问题讨论】:

    标签: python formatting hex uppercase


    【解决方案1】:

    大写 X(Python 2 和 3 使用 sprintf-style formatting):

    print("0x%X" % value)
    

    或者在 python 3+ 中(使用.format string syntax):

    print("0x{:X}".format(value))
    

    或者在 python 3.6+ 中(使用formatted string literals):

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

    【讨论】:

    • 查看我的答案,了解更多使用 f 字符串的 Python 3 习语:print(f'0x{value:X}')
    • 是的。我说% 是来自 2.x 的较旧的操作员宿醉,虽然没有正式弃用,但不鼓励使用。 Python 3.6+ finally allows variable interpolation 就像我们从 3.0 和 .format() 以来一直想要的那样。
    • 如果它在所有已发布版本的 python 3 中的 6/8 上都失败了,这并不是一个“Python 3 习惯用法”(尽管公认大多数是 EOL)
    • '截至今天,“3.x”的意思是“3.6+”或“3.7”' - 根据我的经验,这不是真的。对我来说,3.x 意味着“我的包将支持的最早版本的 python 3”,通常是“所有非 EOL python 3.x”。 “f-strings 很棒” - 你没有错。
    • 如果您的值为负数,所有这些都会给出错误的结果。当你想要的是-0xFF时,你会得到0x-FF
    【解决方案2】:

    只需使用upper()。

    intNum = 1234
    hexNum = hex(intNum).upper()
    print('Upper hexadecimal number = ', hexNum)
    

    输出:

    Upper hexadecimal number =  0X4D2
    

    【讨论】:

    • 但我不认为“0X4D2”是正确的表示法。它应该是“0x4D2”(小写“x”)。
    • '%X' 是最好的。 @PeterMortensen 是正确的。这样一来,你就需要像 ''.join([ '0x', hex(value).upper()[2:] ]) 这样笨重的东西
    【解决方案3】:

    使用大写的%X:

    >>> print("%X" % 255)
    FF
    

    Python 3.6 时代的更新:只需在格式部分使用“X”,在 f-strings 中:

    print(f"{255:X}")
    

    (f-strings 接受: 之前的任何有效 Python 表达式 - 包括直接数字表达式和变量名)。

    【讨论】:

      【解决方案4】:

      print(hex(value).upper().replace('X', 'x'))

      正确处理负数。

      【讨论】:

      • 虽然看起来有点笨拙,但这个答案是解决负数的答案,也不会留下 X 大写,而是遵守 x 小写的标准。 +1
      【解决方案5】:

      更多使用 f-strings 的 Python 3 习惯用法是:

      value = 1234
      print(f'0x{value:X}')
      '0x4D2'
      

      注释(以及为什么这不是重复的):

      • 展示了如何避免大写“0x”前缀,这是其他答案中的问题
      • 展示如何获得变量插值 f'{value}';实际上没有人将(硬编码)十六进制文字放入实际代码中。进行变量插值有很多陷阱:它不是f'{x:value}',也不是f'{0x:value}',也不是f'{value:0x}',甚至不是f'{value:%x}',我也试过了。绊倒的方法有很多。在重新阅读了四个教程和 whatsnew 文档后,我仍然花了 15 分钟的反复试验来获得语法。这个答案显示了如何正确获得 f 字符串变量插值;其他人没有。

      【讨论】:

      • @wim:不,这不是 a) jsbueno 的答案既没有显示如何避免将“0x”前缀大写,也没有显示 b) 如何获得变量插值 f'{value}';没有人真正将十六进制文字放入实际代码中。做插值也有陷阱:不是f'{x:value}',也不是f'{0x:value}',也不是f'{value:0x}'。绊倒的方法很多。我展示了如何不这样做。
      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多