反转从int转换的字符串时,不会打印结尾的0

时间:2019-01-10 02:10:57

标签: python python-3.x

例如:

num = 123401000

def reverse_int(num):
    sign = 1

    if num > 0:
        sign = 1
    else:
        sign = -1

    print(sign)
    tmp = abs(num)
    print(tmp)

    return int(str(tmp)[::-1]) * sign

print(reverse_int(num))

此代码的目的是打印出num的反面,但是此代码打印出104321。谁能告诉我为什么没有捕获到最后的零?

2 个答案:

答案 0 :(得分:2)

零被捕获。但是,当您最后将其转换回int时,在数字上000104321104321之间没有区别,并且int s仅具有一个本机表示形式({{ 1}}和001不会以不同的方式存储以保留1 s)。如果需要保留这些零,则无法转换回0,必须将其保留为int

您可以采取的一种方法是让str存储前缀字符串而不是数字,以编写代码:

sign

答案 1 :(得分:0)

一个整数自然不会像字符串那样保留前导零。 0001只是1。在正向转换期间,这是件好事:123401000变成'123401000',而不是'0000123401000'

换句话说,任何整数中都有无数个前导零。没有特别的理由让Python打印任意数量的代码(如何知道是001、01还是1?),因此默认情况下不会打印前导零。

您可以访问正确数量的前导零,因此没有什么可以阻止您正确打印它们。您当然不需要将数字作为字符串返回,只需跟踪中间字符串的 length 。让您的函数返回反转的整数和所需的打印宽度:

def reverse_int(num):
    sign = 1 if num >= 0 else -1
    tmp = num * sign
    string = str(tmp)
    width = len(string) + (sign == -1)
    return int(string[::-1]) * sign, width

现在,使用正确的格式说明符,您可以打印前导零:

num = 123401000
rev, width = reverse_int(num)
print(f'{rev:0{width}d}')

您可以使用较旧的format函数使此操作更加简洁:

print('{:0{}d}'.format(*reverse_int(num)))

您甚至可以使用真正古老的字符串插值运算符:

print('%0*d' % (width, rev))