我需要将前导零添加到整数以创建具有定义数量的数字($ 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;
}
有功能可以做到这一点吗?
#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
评论
您的代码正在发出通知,顺便说一句php.net/printf是使用php的方法
@SilentGhost或str_pad
为什么在变量前使用$?