【问题标题】:Most pythonic way to pad a float left of the decimal point在小数点左侧填充浮点数的最pythonic方法
【发布时间】:2014-07-27 00:07:28
【问题描述】:

我正在努力完成的事情

-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)

但这对于 python 来说似乎相当迟钝。我看到了一个以前的类似问题,但不喜欢这个答案...

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

因为它假定您已经知道小数点在哪里以及您有多少个小数位。

这似乎是一种常见的情况,那么在 python 2.7 中是否存在更好/更清洁/单一的 fncall 方法来解决这个问题?

【问题讨论】:

  • 我相信str.format()是你想要的
  • stackoverflow.com/questions/17118071/… 看起来它适用于整数但不适用于浮点数,因为我的宽度会根据十进制数字的数量而变化,所以据我所知,我仍然需要计算数字我有十进制数字:\
  • @pyInTheSky:小数位数是什么意思?浮点数是近似值,你总是会反正四舍五入。例如,-12.345 也不是完全 -12.345。 format(-12.345, '.53f') > '-12.34500000000000063948846218409016728401184082031250000'.
  • 所以你想要左边的固定宽度为 3,右边的宽度可变?
  • @user2357112 是正确的

标签: python python-2.7


【解决方案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

【讨论】:

  • 令人遗憾的是,似乎没有一个漂亮的内置方式,但是 b.a.对于一些疯狂的拼接逻辑。我不知道可以这样做。
【解决方案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

【讨论】:

  • 是的,我正在参加 NMEA lat。已从 str 转换为 float 的值(在 lats
【解决方案3】:

固定分数与动态分数:

>>> "{: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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多