从浮点数中删除尾随'.0'

时间:2008-12-22 01:33:34

标签: python

我正在寻找一种方法将数字转换为字符串格式,删除任何多余的'.0'

输入数据是浮点数和字符串的混合。期望的输出:

0 - > '0'

0.0 - > '0'

0.1 - > '0.1'

1.0 - > '1'

我想出了以下生成器表达式,但我想知道是否有更快的方法:

(str(i).rstrip('.0') if i else '0' for i in lst)

真值检查是为了防止0成为空字符串。

编辑:我现在或多或少可接受的解决方案是:

('%d'%i if i == int(i) else '%s'%i for i in lst)

在python中没有优雅的方法来处理这个(相当简单的)情况,这似乎很奇怪。

16 个答案:

答案 0 :(得分:65)

请参阅PEP 3101

'g' - General format. This prints the number as a fixed-point
      number, unless the number is too large, in which case
      it switches to 'e' exponent notation.

旧式:

>>> "%g" % float(10)
'10'

新款式(推荐):

>>> '{0:g}'.format(float(21))
'21'

答案 1 :(得分:17)

rstrip没有做你想做的事情,它会删除你给它的任何字符,而不是后缀:

>>> '30000.0'.rstrip('.0')
'3'

实际上,'%g' % i只会做你想要的。 编辑:正如罗伯特在他的评论中指出的那样,这对大数字不起作用,因为它使用的默认精度为%g,即6位有效数字。

由于str(i)使用12位有效数字,我认为这样可行:

>>> numbers = [ 0.0, 1.0, 0.1, 123456.7 ]
>>> ['%.12g' % n for n in numbers]
['1', '0', '0.1', '123456.7']

答案 2 :(得分:8)

>>> x = '1.0'
>>> int(float(x))
1
>>> x = 1
>>> int(float(x))
1

答案 3 :(得分:7)

def floatstrip(x):
    if x == int(x):
        return str(int(x))
    else:
        return str(x)

请注意,在我的系统0.10000000000000001上,Python表示0.1为不精确浮点数。

答案 4 :(得分:7)

(str(i)[-2:] == '.0' and str(i)[:-2] or str(i) for i in ...)

答案 5 :(得分:5)

那里的丑陋......

我个人最喜欢的是将float转换为float(当它们实际上是整数时)转换为int,从而删除现在无用的,尾随0

(int(i) if i.is_integer() else i for i in lst)

然后你可以正常打印它们。

答案 6 :(得分:4)

如果您只关心精度的1位小数(如示例所示),您可以这样做:

("%.1f" % i).replace(".0", "")

这会将数字转换为带有1位小数的字符串,如果它为零,则将其删除:

>>> ("%.1f" % 0).replace(".0", "")
'0'
>>> ("%.1f" % 0.0).replace(".0", "")
'0'
>>> ("%.1f" % 0.1).replace(".0", "")
'0.1'
>>> ("%.1f" % 1.0).replace(".0", "")
'1'
>>> ("%.1f" % 3000.0).replace(".0", "")
'3000'
>>> ("%.1f" % 1.0000001).replace(".0", "")
'1'

答案 7 :(得分:3)

from decimal import Decimal
'%g' % (Decimal(str(x)))

答案 8 :(得分:3)

要打印float,其整数值为int

format = "%d" if f.is_integer() else "%s"
print(format % f)

Example

             0.0 -> 0
             0.1 -> 0.1
            10.0 -> 10
      12345678.9 -> 12345678.9
     123456789.0 -> 123456789
12345678912345.0 -> 12345678912345
12345678912345.6 -> 1.23456789123e+13
  1.000000000001 -> 1.0

答案 9 :(得分:1)

使用Python的string formatting(在Python 3.0中使用str.format()):

from decimal import Decimal

def format_number(i):
    return '%g' % (Decimal(str(i)))

答案 10 :(得分:1)

str(x)[-2:] == '.0' and int(x) or x

答案 11 :(得分:1)

以下代码将转换变量no的内容,即45.60。如果您使用str,则输出将为45.6

no = 45.60

strNo = "%.2f" %no

答案 12 :(得分:0)

>>> '%g' % 0
'0'
>>> '%g' % 0.0
'0'
>>> '%g' % 0.1
'0.1'
>>> '%g' % 1.0
'1'

答案 13 :(得分:0)

FWIW,其中Jinja2,其中var = 10.3

{{ var|round|int }}将发出整数10

round(method='floor')round(method='ceil')也可用。

因此var2 = 10.9 {{ var|round(method='floor')|int }}仍会发出整数10

也可以使用precision=0函数的关键字参数round来控制精度。

参考:http://jinja.pocoo.org/docs/dev/templates/#round

答案 14 :(得分:0)

我正在处理来自json字典的值(由API返回)。以上所有都没有帮助我所以我通过自己的帮助函数构建。它会截断所有尾随零。

我希望它可以帮助那里的人

<li><a routerLinkActive="group-active">Group 1</a>
    <ul>
        <li routerLinkActive="active"><a [routerLink]="['/group1/page1']">Group 1 - Page 1</a>
        <li routerLinkActive="active"><a [routerLink]="['/group1/page2']">Group 1 - Page 2</a>
        <li routerLinkActive="active"><a [routerLink]="['/group1/page3']">Group 1 - Page 3</a>
    </ul>
</li>

打印:

def remove_zeros(num):
    nums = list(num)
    indexes = (list(reversed(range(len(nums)))))
    for i in indexes:
        if nums[i] == '0':
            del nums[-1]
        else:
            break
    return "".join(nums)

num = "0.000000363000"
print(remove_zeros(num))

答案 15 :(得分:-2)

使用0精度并根据需要添加句点。 EG“%。0f。”

>>> print "%.0f."%1.0
1.
>>>