将整数格式化为带前导零的字符串的最佳方法?

ram*_*sus 270 python string-formatting

我需要将前导零添加到整数以生成具有已定义数字位数的字符串($ cnt).将这个简单函数从PHP转换为Python的最佳方法是什么:

function add_nulls($int, $cnt=2) {
    $int = intval($int);
    for($i=0; $i<($cnt-strlen($int)); $i++)
        $nulls .= '0';
    return $nulls.$int;
}
Run Code Online (Sandbox Code Playgroud)

有没有可以做到这一点的功能?

小智 569

您可以使用该zfill()方法用零填充字符串:

In [3]: str(1).zfill(2)
Out[3]: '01'
Run Code Online (Sandbox Code Playgroud)

  • @Ajay 004不是实际的整数 (45认同)
  • 需要说这不正确."004 == 4"的事实是有点幸运的.解释器(python未编译)解析int的方式与以前导"0"开头的int不同.如果数字以"0"开头,那么它被认为是8-nary数.所以是的,'004 == 4`,但是'040!= 40`因为`040 = 4*8 + 0 = 32`. (20认同)
  • 编译器解析`004`的方式,然后在内存中表示,与`4`完全相同.唯一可见差异的是`.py`源代码.如果你需要存储信息,如"格式化这个数字与领先的零至百位",整数不能单独提供 - 你需要使用替代数据结构(字符串工作以及在这种情况下) (16认同)
  • 澄清一些事情:1.仅在解析整数文字时才这样,而不是将字符串转换为整数 - 例如.如果你执行a = 010那么a的值将是8但是如果你执行a = int("010"),则a的值将是10. 2.只有Python 2以这种方式运行 - 在python 3中,a = 010会给出语法错误.python 3中的八进制以0o开头,例如.0o10(可能是为了避免这种确切的混淆). (9认同)
  • 有没有办法做同样的事情只返回像 004 这样的实际整数而不是像“004”这样的字符串? (2认同)
  • 为什么004不是整数?Python 说“004 == 4”是正确的,据我所知,数学也同意这一点。 (2认同)
  • 谢谢你!我用它通过 f'string 显示时间,而不需要拉入时间库,即不是显示 12:7,而是可以使用以下代码显示 12:07 Final_min = str(final_min).zfill(2) new_time = f '{final_hr}:{final_min}' (2认同)

use*_*450 156

标准方法是使用格式字符串修饰符.这些格式字符串方法在大多数编程语言中都可用(例如通过c中的sprintf函数),并且是一个方便的工具.

i = random.randint(0,99999)
print "%05d" % i
Run Code Online (Sandbox Code Playgroud)

这将输出一个长度为5的字符串.


编辑:在Python2.6及更高版本中,还有:

print '{0:05d}'.format(i)
Run Code Online (Sandbox Code Playgroud)

请参阅:https://docs.python.org/2/library/string.html

  • %被弃用,转而使用.format (12认同)
  • @Zelphir你可以动态创建格式化字符串,`[('{{0:0 {0:d} d}}').format(len(my_list)).my_list中k的格式(k)] (3认同)
  • 当所有模板包含一个`{...}`占位符时,不需要使用`str.format()`.避免解析模板并使用`format()`函数:`format(i,'05d')` (2认同)
  • @Mark 不需要使用嵌套/堆叠格式。位数可以是可变的: `[('{0:0{1}d}').format(k, len(my_list)) for k in my_list]` --- 使用 f 字符串:`[f '{k:0{len(my_list)}d}' for k in my_list]` --- 奇怪的是,位数是由项目数决定的。您可能想要准备 `max_digits` 并使用 `[f'{k:0{max_digits}d}' for k in my_list]` (2认同)

Sil*_*ost 67

您很可能只需要格式化整数:

'%0*d' % (fill, your_int)
Run Code Online (Sandbox Code Playgroud)

例如,

>>> '%0*d' % (3, 4)
'004'
Run Code Online (Sandbox Code Playgroud)

  • @Matthew Schnickel:我认为OP想知道一种方法来计算他需要的零的数量。格式化处理得很好。int(x, 10) 处理前导零。 (3认同)
  • 问题是 - 如何添加非永久数量的零 (2认同)
  • 不,那不是问题. (2认同)
  • 这不是永久性的 - 实际上你不能永久地将零添加到int中 - 然后将其解释为八进制值. (2认同)

Ser*_*ujo 55

Python 3.6 f-strings允许我们轻松添加前导零:

number = 5
print(f' now we have leading zeros in {number:02d}')
Run Code Online (Sandbox Code Playgroud)

看看这篇好帖子.

  • 这现在应该是公认的答案 (5认同)
  • 这是迄今为止最pythonic的,当然也是我最喜欢的答案。 (3认同)

clo*_*orz 21

Python 2.6允许这样:

add_nulls = lambda number, zero_count : "{0:0{1}d}".format(number, zero_count)

>>>add_nulls(2,3)
'002'
Run Code Online (Sandbox Code Playgroud)


Yun*_*age 15

对于Python 3及更高版本:str.zfill()仍然是最易读的选项

但是查看新的强大的str.format()是一个好主意,如果你想填充不是0的东西怎么办?

    # if we want to pad 22 with zeros in front, to be 5 digits in length:
    str_output = '{:0>5}'.format(22)
    print(str_output)
    # >>> 00022
    # {:0>5} meaning: ":0" means: pad with 0, ">" means move 22 to right most, "5" means the total length is 5

    # another example for comparision
    str_output = '{:#<4}'.format(11)
    print(str_output)
    # >>> 11##

    # to put it in a less hard-coded format:
    int_inputArg = 22
    int_desiredLength = 5
    str_output = '{str_0:0>{str_1}}'.format(str_0=int_inputArg, str_1=int_desiredLength)
    print(str_output)
    # >>> 00022
Run Code Online (Sandbox Code Playgroud)


tzo*_*zot 5

您至少有两个选择:

  • str.zfill: lambda n, cnt=2: str(n).zfill(cnt)
  • % 格式: lambda n, cnt=2: "%0*d" % (cnt, n)

如果在Python> 2.5上,请参阅clorz答案中的第三个选项.