繁体   English   中英

f-strings 可以自动填充到 output 上的 [下一个] 偶数位数吗?

[英]Can f-strings auto-pad to [the next] even number of digits on output?

基于这个答案(除其他外),f-strings 似乎是转换为十六进制表示的首选方法之一。

虽然可以指定一个明确的目标长度,最多可以用前导零填充,但考虑到 output 的目标是偶数位数和任意位数的输入,我可以想象:

  • 预处理以确定输入的位数,将特定于输入的值馈送到 fstring,或
  • 后处理 a-la out = "0"+f"{val:x}" if len(f"{val:x}") % 2 else f"{val:02x}" (甚至使用.zfill() )

后者似乎比前者更有效 - 是否有使用 fstrings 的内置方法或更好的替代方法?

输入示例 + 预期 output:

[0x]1 -> [0x]01
[0x]22 -> [0x]22
[0x]333 -> [0x]0333
[0x]4444 -> [0x]4444

等等。

您可以在 f 字符串的填充长度部分使用变量。 例如:

n = 4
val = 257
print(f"{val:0{n}x}") # 0101

现在,要弄清楚 integer 中有多少个十六进制字符,您只需要找出 integer 中有多少位:

hex_count, rem = divmod(max(1, val.bit_length()), 4)
hex_count += (rem > 0)

max(1, val.bit_length())处理val == 0的情况,其位长为 0)

所以让我们得到hex_count之后的下一个偶数:

pad_length = hex_count + (hex_count % 2)
print(f"{val:0{pad_length}x}") # 0101

我不确定这是否比简单地将其转换为十六进制字符串然后确定需要多少填充更好,但我想不出一种可读的方法来在 f 字符串中完成这一切。 一种不可读的方法是将上述所有内容组合成一行,但 IMO 可读代码比不可读的单行代码更好。 我认为没有办法将您想要的内容指定为简单的 f 字符串。

请注意,负数被格式化为偶数位数,加上-符号。

我认为 f-string 格式没有内置任何东西可以做到这一点。 您可能必须弄清楚“自然”宽度是多少,然后将其四舍五入到下一个偶数。

像这样的东西:

def hf(n):
    width = len(hex(n)) - 2 # account for leading 0x
    width += width % 2 # round up
    return f'{n:0{width}x}'

print(hf(1))
print(hf(15))
print(hf(16))
print(hf(255))
print(hf(256))

Output:

01
0f
10
ff
0100

这是使用赋值表达式(Python 3.8+)的后处理替代方案:

print((len(hx:=f"{val:x}") % 2) * '0' + hx)

如果你仍然想要一个没有赋值表达式的单行,你必须计算你的 f-string 两次:

print((len(f"{val:x}") % 2) * '0' + f"{val:x}")

作为双排

hx = f"{val:x}"
print((len(hx) % 2) * '0' + hx)

还有一个版本:

print(f"{'0'[:len(hex(val))%2]}{val:x}")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM