【问题标题】:Get the string in 2 digit format with leading zeros in python在python中获取带有前导零的2位数格式的字符串
【发布时间】:2015-10-24 12:46:51
【问题描述】:

我需要添加 2 个 mac 格式的字符串作为具有 9 个八位字节的十六进制。作为其中的一部分,我几乎已经实现了,但最后一件事是获得 2 位格式的值。

string1= "aa.aa.aa.aa.aa.aa.aa.aa.ff"
string2= "00.00.00.00.00.00.00.00.01" 

当我添加这两个时,我得到的输出是 aa.aa.aa.aa.aa.aa.aa.ab.0 但我希望值为 aa.aa.aa.aa.aa.aa.aa.ab.00 。 (2 个零)。

我尝试过使用

temp = '%02d' % string3 

但我得到了错误

TypeError: %d format: a number is required, not str

因为我正在尝试使用字符串来做到这一点。

【问题讨论】:

  • b 是从哪里来的?'
  • 您是否尝试过将该字符串部分转换为 int?
  • 你是如何添加这两个字符串的?
  • Avinash 我正在添加两个十六进制格式的字符串,所以 ff+1 将是 1 00,其中 1 向后进位,所以这里 aa.ff 变成 ab.00

标签: python


【解决方案1】:

您可以拆分字符串,用前导零填充每个部分并再次加入:

s = "aa.aa.aa.aa.aa.aa.aa.ab.0"
print '.'.join(["{0:0>2}".format(w) for w in s.split('.')])

输出:

aa.aa.aa.aa.aa.aa.aa.ab.00

(填充基于this answer。)


基于map 的更短版本:

print '.'.join(map("{0:0>2}".format, s.split('.')))

【讨论】:

  • 非常感谢法尔科。有效。两种方法中哪一种更好?填充还是基于地图?
  • format 函数进行填充。所以区别在于使用list comprehensionmap 函数。在我看来,在这里使用哪一个并不重要。使用map,您可以保存一个临时变量,这可能会提高可读性。
【解决方案2】:

您可以改进创建它的方式,而不是修复生成的string3。如果将和数转换为整数,将它们相加并将结果转换回十六进制表示,则不必担心丢失零:

a = "aa.aa.aa.aa.aa.aa.aa.aa.ff"
b = "00.00.00.00.00.00.00.00.01"
c = hex(int(a.replace('.', ''), 16) + int(b.replace('.', ''), 16))[2:-1]
print '.'.join(i+j for i,j in zip(c[::2], c[1::2]))

输出:

aa.aa.aa.aa.aa.aa.aa.ab.00

参考资料:

【讨论】:

  • 这太棒了。我有大约 15 行代码来执行此操作。但你只写了 3 行代码……天才。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 2018-01-17
  • 2015-04-05
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多