在Python中去除尾随零

34 投票
7 回答
83530 浏览
提问于 2025-04-16 16:31

我需要找到一种方法来在Python中转换以下字符串:

0.000       => 0
0           => 0
123.45000   => 123.45
0000        => 0
123.4506780 => 123.450678

然后继续。我试过用 .rstrip('0').rstrip('.'),但是如果输入是0或00的话,这个方法就不管用了。

有什么好主意吗?谢谢!

7 个回答

9

对于浮点数,你可以直接把字符串转换成一个 float 类型:

>>> float('123.4506780')
123.450678

对于零值,你可以直接把它们转换成整数:

>>> int('0000')
0

当你打印数字时,它们会自动变成字符串。如果你需要这些值真的变成字符串,你可以用 str() 把它们再转换回来,比如:

>>> str(float('123.4506780'))
'123.450678'
25

如果你想的话,可以使用格式字符串,但要注意,你可能需要设置你想要的精度,因为格式字符串默认有自己的处理逻辑。Janneb在另一个回答中建议使用17位的精度。

'{:g}'.format(float(your_string_goes_here))

不过,经过进一步思考,我觉得最简单也是最好的解决办法就是把字符串转换两次(正如jathanism所建议的)。

str(float(your_string_goes_here))

编辑:因为评论的原因,添加了说明。

28

更新 进行了通用化,以保持精确度并处理未见过的值:

import decimal
import random

def format_number(num):
    try:
        dec = decimal.Decimal(num)
    except:
        return 'bad'
    tup = dec.as_tuple()
    delta = len(tup.digits) + tup.exponent
    digits = ''.join(str(d) for d in tup.digits)
    if delta <= 0:
        zeros = abs(tup.exponent) - len(tup.digits)
        val = '0.' + ('0'*zeros) + digits
    else:
        val = digits[:delta] + ('0'*tup.exponent) + '.' + digits[delta:]
    val = val.rstrip('0')
    if val[-1] == '.':
        val = val[:-1]
    if tup.sign:
        return '-' + val
    return val

# test data
NUMS = '''
    0.0000      0
    0           0
    123.45000   123.45
    0000        0
    123.4506780 123.450678
    0.1         0.1
    0.001       0.001
    0.005000    0.005
    .1234       0.1234
    1.23e1      12.3
    -123.456    -123.456
    4.98e10     49800000000
    4.9815135   4.9815135
    4e30        4000000000000000000000000000000
    -0.0000000000004 -0.0000000000004
    -.4e-12     -0.0000000000004
    -0.11112    -0.11112
    1.3.4.5     bad
    -1.2.3      bad
'''

for num, exp in [s.split() for s in NUMS.split('\n') if s]:
    res = format_number(num)
    print res
    assert exp == res

输出:

0
0
123.45
0
123.450678
0.1
0.001
0.005
0.1234
12.3
-123.456
49800000000
4.9815135
4000000000000000000000000000000
-0.0000000000004
-0.0000000000004
-0.11112
bad
bad

撰写回答