我想要完成的事情
-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中实现这个目标?
答案 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