【问题标题】:Best way to format integer as string with leading zeros? [duplicate]将整数格式化为带前导零的字符串的最佳方法? [复制]
【发布时间】:2010-10-18 12:30:23
【问题描述】:

我需要在整数中添加前导零,以生成具有已定义位数 ($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;
}

有没有可以做到这一点的函数?

【问题讨论】:

  • 你的代码正在产生通知,顺便说一句
  • php.net/printf 是 php 的方式
  • @SilentGhost 或 str_pad
  • 为什么在变量前使用 $?

标签: python string-formatting


【解决方案1】:

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

In [3]: str(1).zfill(2)
Out[3]: '01'

【讨论】:

  • 有没有办法只返回一个像 004 这样的实际整数而不是像 '004' 这样的字符串?
  • @Ajay 004 不是实际整数
  • 004被编译器解析,然后在内存中表示的方式与4完全相同。唯一可见的差异是在.py 源代码中。如果您需要存储诸如“用前导零格式化此数字直到数百位”之类的信息,仅整数无法提供这一点 - 您需要使用备用数据结构(在这种情况下字符串工作得很好)
  • 需要说这是不正确的。 004 == 4 这个事实有点幸运。对于以0 开头的整数,解释器(python 未编译)解析整数的方式是不同的。如果一个数字以0 开头,则将其视为 8 进制数。所以是的,004 == 4,但是040 != 40 因为040 = 4 * 8 + 0 = 32
  • 澄清几件事: 1. 这仅适用于整数文字的解析,不适用于将字符串转换为整数 - 例如。如果您执行 a = 010 则 a 的值为 8 但如果您执行 a = int("010") 则 a 的值为 10。 2. 只有 Python 2 以这种方式运行 - 在 python 3 中,a = 010会给出语法错误。 python 3中的八进制以0o开头,例如。 0o10(大概是为了避免这种确切的混淆)。
【解决方案2】:

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

输出长度为5的字符串:

...在 Python 3.5 及更高版本中:

i = random.randint(0, 99999)
print(f'{i:05d}')

... Python 2.6 及以上版本:

print '{0:05d}'.format(i)

...在 Python 2.6 之前:

print "%05d" % i

见:https://docs.python.org/3/library/string.html

【讨论】:

  • 如果在运行前不知道零的数量怎么办?比方说列表的长度?
  • @Zelphir 你可以动态创建格式化字符串,[('{{0:0{0:d}d}}').format(len(my_list)).format(k) for k in my_list]
  • 我选择连接格式字符串,例如插入列表的长度。你的做法有什么好处吗?
  • 当所有模板包含一个{...} 占位符时,不需要使用str.format()。避免解析模板并改用format() 函数:format(i, '05d')
【解决方案3】:

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

number = 5
print(f' now we have leading zeros in {number:02d}')

查看this good post 了解此功能。

【讨论】:

  • 这是最pythonic的,当然也是迄今为止我最喜欢的答案。
  • 现在应该是公认的答案
【解决方案4】:

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

'%0*d' % (fill, your_int)

例如,

>>> '%0*d' % (3, 4)
'004'

【讨论】:

  • 问题是 - 如何添加非永久数量的零
  • 这不是永久的——事实上你不能在一个 int 的 from 中永久添加零——然后它会被解释为一个八进制值。
  • @Matthew Schnickel:我认为 OP 想知道一种方法来计算他需要的零的数量。格式化处理得很好。 int(x, 10) 处理前导零。
【解决方案5】:

Python 2.6 允许这样做:

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

>>>add_nulls(2,3)
'002'

【讨论】:

    【解决方案6】:

    对于 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
    

    【讨论】:

      【解决方案7】:

      您至少有两个选择:

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

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

      【讨论】:

        【解决方案8】:

        内置zfill的单线替代方案。

        此函数接受x 并将其转换为字符串,并且仅在开头添加零且仅当长度太短时:

        def zfill_alternative(x,len=4): return ( (('0'*len)+str(x))[-l:] if len(str(x))<len else str(x) )
        

        总结一下 - 内置:zfill 已经足够好了,但如果有人对如何手动实现这一点感到好奇,这里还有一个示例。

        【讨论】:

          【解决方案9】:

          一个简单的转换将是(再次使用函数):

          def add_nulls2(int, cnt):
              nulls = str(int)
              for i in range(cnt - len(str(int))):
                  nulls = '0' + nulls
              return nulls
          

          【讨论】:

            【解决方案10】:

            这是我的 Python 函数:

            def add_nulls(num, cnt=2):
              cnt = cnt - len(str(num))
              nulls = '0' * cnt
              return '%s%s' % (nulls, num)
            

            【讨论】:

            • str.zfill 是做什么的 :)
            • yes :) 另一种方法是:'%03d' % 8
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-09
            • 1970-01-01
            • 2017-12-18
            • 2014-07-17
            • 2011-05-02
            • 1970-01-01
            相关资源
            最近更新 更多