在Python中删除尾随零

Rai*_*ers 24 python string zero

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

0.000       => 0
0           => 0
123.45000   => 123.45
0000        => 0
123.4506780 => 123.450678
Run Code Online (Sandbox Code Playgroud)

等等.我尝试了.rstrip('0').rstrip('.'),但如果输入为0或00则不起作用.

有任何想法吗?谢谢!

sam*_*ias 21

更新了 Generalized以保持精度并处理看不见的值:

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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

  • @samplebias:任何非零整数都会附加一个小数点。使用 str() 会失去精度,例如 `str(float('.1234567890123456'))` 会产生 `'0.123456789012'` **FAIL** (2认同)

aru*_*l84 11

您可以根据需要使用格式字符串,但请注意,您可能需要设置所需的精度,因为默认情况下格式字符串有自己的逻辑.Janneb在另一个答案中建议精确度为17 .

'{:g}'.format(float(your_string_goes_here))
Run Code Online (Sandbox Code Playgroud)

然而,在考虑了这个之后,我认为最简单和最好的解决方案就是将字符串转换两次(如jathanism所示):

str(float(your_string_goes_here))
Run Code Online (Sandbox Code Playgroud)

编辑:因评论而添加了说明.

  • 有趣,但是 10003.4506700 给出 10003.5 , 15000.0012 给出 15000 , 78000.89 给出 78000.9 , .1234567890123456000 给出 0.123457 。不过,我因为 format() 方面的知识而投票 (2认同)

jat*_*ism 7

对于浮点数,您只需将字符串转换为float:

>>> float('123.4506780')
123.450678
Run Code Online (Sandbox Code Playgroud)

对于零值,您可以将它们转换为整数:

>>> int('0000')
0
Run Code Online (Sandbox Code Playgroud)

打印时,数值会自动转换为字符串.如果你需要这些实际上是字符串,你可以简单地将它们转换回字符串str(),例如:

>>> str(float('123.4506780'))
'123.450678'
Run Code Online (Sandbox Code Playgroud)

  • Python没有双打!浮点数在C中使用double实现. (2认同)