如何保留整型变量的前导零?

14

以下是一个功能性解密和加密程序的一部分代码。

while checkvar < maxvar: # is set to < as maxvar is 1 to high for the index of var
    #output.append("%02d" % number)
    i =ord(var[checkvar]) - 64 # Gets postional value of i
    i = ("%02d" % i)
    if (checkvar + 1) < maxvar:
        j =ord(var[(checkvar + 1)]) - 64 # Gets postional value of i
        j = ("%02d" % j)
        i = str(i) + str(j) #'Adds' the string i and j to create a new i
    li.append(int(i))
    checkvar = checkvar + 2

print li

你可以看到,变量i和j首先被视为字符串来添加一个0在任何个位数前面(作为字符串)。 然后将这些变量组合成四位数字(仍然是字符串)。 程序后来使用创建的数字在pow()函数中,因为int会删除任何前导零。

我的问题是:是否有可能强制Python保留int的前导零?我已经在网上搜索过。

编辑

为了帮助其他人,我已经包含了程序的加密部分。 这就是问题所在。 在上述代码中创建的变量通过pow()函数传递。 由于它无法处理字符串,因此必须将变量转换为int,其中前导零丢失。

#a = li[]
b=int(17)#pulic = e
c=int(2773)#=n

lenli=int(len(li))
enchecker = int(0)

#encrpted list
enlist = []

while enchecker < lenli:
    en = pow(li[enchecker],b,c)#encrpyt the message can only handle int
    enlist.append(int(en))
    enchecker = enchecker + 1

print enlist

1
你写了 i = "%02d" %i,这里是正确的做法... 为什么它对你不起作用? - inspectorG4dget
2
不,整数值不会带有前导零。否则,你如何定义要考虑多少个前导零呢?你需要将其格式化为字符串形式,这是你目前正在使用的方式。 - Rohit Jain
当Python存储整数时,在底层它只是一堆二进制的1和0。你看到的十进制数是这些位组成的人类可读表示形式。你可以使用字符串格式化函数(就像你正在使用的那个)向此表示形式添加前导零,但你不能在int本身中存储前导零。这根本没有意义。 - NullUserException
@inspectorG4dget。那段代码确实有效。问题在于int变量去掉了0。针对Rohit Jain的问题,如果你问有多少个零,我认为已经完成了(虽然它仍然是一个字符串)。如果你谈论Python定义零,那我不知道。 - Dan1676
4个回答

35
尽管上面的评论是正确的,关于1、01和001都与int相同,但在时间建模或连续电影制作中保留前导零非常有帮助。我经常这样做,以确保电影剪辑按正确顺序排列。简单的方法是使用zfill()函数,以确保数字的str版本至少具有您指定的字符数,并通过在字符串“number”的左侧填充零来实现此目的。
>>> x = int(1)    
>>> NewStringVariable = str(x).zfill(3)    
>>> print NewStringVariable    
001    
>>> NewStringVariable = str(x).zfill(5)    
>>> print NewStringVariable    
00001

4
我认为这个答案应该被接受。 - FaCoffee
3
这将创建一个“字符串”而不是“整数”类型的变量。在这个上下文中,“TYPE”很重要。如果我们想要新变量是“字符串类型”,那么这是一种好方法,但如果我们需要“整数类型”,那么就不行。 - Xonshiz
最佳答案。但是,如果前导零的数量是可变的,例如我们不知道但是想要保留输入数字的前导零呢? - deadcode
2
在 int 类型中维护前导 0 没有任何意义。1、01 和 001 都只是 1,唯一需要前导零的时候是为了显示目的。 - ThinkingInBits
这很有道理。然而,我只是指出来,以防有人寻找此处并且不知道为什么会抛出其他错误。 - Xonshiz

15

前导零的概念是一个显示概念,而非数字概念。在数字前面添加无限个前导零并不会改变它的值。由于它不是数值概念,因此不会与数字一起存储。

当您将数字转换为字符串时,您必须决定要添加多少个零。如果需要,您可以将该数字单独保留。


1

试一试这个:

number = 1
print("%02d" % (number,))

或者:

print("{:02d}".format(number))

"%02d"的解释:

% - 这告诉解释器应该在此处插入一个变量。

02 - 这告诉解释器期望变量长度为2。

d - 这告诉解释器期望一个数字,或者说一个“数字”。


请为您的代码添加一些解释。 - user67275

1
我从我的Arduino串行线路中获取的日期字符串格式为hhmmss
假设我得到了s = "122041",这将是12:20:41,但上午9点将是090000
语句print "%d" % (s)会引发运行时错误,因为9不是八进制数,因此是非法字符。
要解决此问题:
print "%06d" % (int(s))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接