我需要将前导零添加到整数以创建具有定义数量的数字($ 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

为什么在变量前使用$?

#1 楼

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

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


评论


有没有办法只返回一个实际的整数(如004)而不是一个字符串(如“ 004”)呢?

–阿贾伊
2014年7月29日在20:10

@Ajay 004不是实际的整数

–阿尔瓦罗
15年1月29日在18:37

004被编译器解析,然后在内存中表示的方式与4完全相同。唯一可见的区别是在.py源代码中。如果您需要存储诸如“用前导零格式化此数字直到百位”之类的信息,则仅靠整数不能提供这种信息-您需要使用备用数据结构(在这种情况下,字符串可以很好地工作)

– Gershy
2015年11月11日在16:20



需要说这是不正确的。 004 == 4的事实有点幸运。对于以0开头的整数,解释器(未编译的python)解析ints的方式有所不同。如果数字以0开头,则将其视为8进制数。是的,004 == 4,但是040!= 40,因为040 = 4 * 8 + 0 = 32。

– sbeliakov
17年1月9日在15:01

为了澄清两件事:1.仅对于整数文字的解析是正确的,而不是将字符串转换为int的事实-例如。如果执行a = 010,则a的值将为8,但是如果执行a = int(“ 010”),则a的值将为10。2.仅Python 2如此操作-在python 3中,a = 010会给出语法错误。 python 3中的八进制以0o开头,例如。 0o10(大概是为了避免这种确切的混淆)。

–汤姆
17年3月31日在8:58



#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 Kaltstahl)
15年8月16日在23:26

@Zelphir,您可以为my_list中的k动态创建格式字符串[[''{{0:0 {0:d} d}}')。format(len(my_list))。format(k)。

–马克
15年8月28日在8:31

我选择连接格式字符串,例如插入列表的长度。您的这样做方式有什么优势吗?

–塞尔菲·卡尔斯塔尔(Zelphir Kaltstahl)
15年8月29日在10:19

当所有模板包含的都是一个{...}占位符时,无需使用str.format()。避免解析模板,而使用format()函数:format(i,'05d')

–马丁·彼得斯(Martijn Pieters)♦
16-09-29在19:01

#3 楼

Python 3.6 f字符串使我们可以轻松添加前导零:

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


看看有关此功能的这篇好文章。

评论


这是最蟒蛇的,也是到目前为止我最喜欢的答案。

–约翰·福布斯(John Forbes)
'18 Sep 3'在6:40

现在这应该是公认的答案

–约翰·伯吉斯(Johann Burgess)
18年11月28日在3:22

#4 楼

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

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


例如

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


评论


问题是-如何不添加零的永久数量

– Ramusus
09年4月9日在9:20

这不是永久性的-实际上您不能将零永久性地添加到int的源中-然后将其解释为八进制值。

–马修·辛克尔(Matthew Schinckel)
09年4月9日在11:56

@Matthew Schnickel:我认为OP想要知道一种计算他需要的零个数的方法。格式化处理很好。并且int(x,10)处理前导零。

–未知
09年4月9日在12:15

#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的作用:)

–tzot
09年4月9日在11:33

是的:)另一方法是这样:'%03d'%8

–埃姆雷
09年4月9日在12:19