大多数pythonic方式填充小数点左侧的浮点数

时间:2014-06-05 20:27:26

标签: python python-2.7

我想要完成的事情

-12.345 -> -012.345

小数点左边可以是-999-> 999(根据我的具体需要)和n-小数位数

我提出了两种方法来做到这一点:

def pad(num, pad):
    pad = pow(10,pad)
    if num > 0:
        return "%s" %  str(num + pad)[1:]
    else:
        return "-%s" % str(num - pad)[2:]

def pad(num, pad):
    import math
    mag  = 1 + int(math.log10(abs(num)))
    sz   = len(str(num))
    return str(num).zfill(pad+sz-mag)

但这似乎是愚蠢的愚蠢。我看到了之前类似的问题,但不喜欢答案......

>>> "%06.2f"%3.3
'003.30'

因为它假设您已经知道小数点的位置以及您有多少位数。

这似乎是一种常见的情况,那么是否存在更好/更清洁/单一的fncall,在python 2.7中实现这个目标?

3 个答案:

答案 0 :(得分:2)

我认为你找到了一个角落案例。在小数位的左侧和右侧指定数字很容易;它也很容易指定总位数;在左侧指定数字并将数字向左完全未指定是不容易的。

我建议最干净的事情是只取浮点数的整数部分并格式化,然后取分数和格式(不指定长度)。

这是一个经过测试的功能,能够满足您的要求,并且对负数也能正常工作。

import math

def float_lformat(f, width):
    neg = f < 0.0
    fraction, n = math.modf(abs(f)) # get fraction and integer parts of f
    if neg and width > 0:
        width -= 1
    s = "%0*d" % (width, n) + str(fraction)[1:]
    if neg:
        s = '-' + s
    return s

答案 1 :(得分:1)

不确定这是否是pythonic。它只是填充整数并连接小数。

def pad(x, p):
    return ('%0'+str(p+(x<0 and 1 or 0))+'d%s') % (x,str(x-int(x))[x<0 and 2 or 1:])

测试

pad(-3,3) -> -003
pad(3,3) -> 003
pad(-3.3,3) -> -003.3
pad(3.3,3) -> 003.3

答案 2 :(得分:0)

固定与动态分数:

>>> "{:08}".format(-12.345)
'-012.345'

>>> a,b=str(x).split('.');a=int(a);"{}{:03}.{}".format('-' if a<0 else"",abs(a),b)
'-012.345'

清理:

def pad(x):
    a, b = str(x).split('.')
    a = int(a)
    return '{}{:03}.{}'.format('-' if a < 0 else ' ', abs(a), b)

for x in [12.0, 12.345, -12.345, -12.3456]:
    print('{:>8} -> {}'.format(x, pad(x)))

输出:

    12.0 ->  012.0
  12.345 ->  012.345
 -12.345 -> -012.345
-12.3456 -> -012.3456