Подтвердить что ты не робот

Отбрасывание ".0" из поплавков

Я ищу способ преобразования чисел в строковый формат, сбросив любые избыточные '.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 в пустую строку.

EDIT: более или менее приемлемое решение, которое у меня есть сейчас:

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

Кажется странным, что нет простого способа справиться с этим (довольно простым) случаем в python.

4b9b3361

Ответ 1

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

Ответ 2

См. 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'

Ответ 3

rstrip не выполняет то, что вы хотите, он удаляет любые символы, которые вы ему даете, а не суффикс:

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

Собственно, только '%g' % i будет делать то, что вы хотите. EDIT: как заметил Роберт в своем комментарии, это не будет работать для больших чисел, так как использует стандартную точность% 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']

Ответ 4

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

Ответ 5

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

Помните, что Python представляет 0,1 как неточное значение float, на моей системе 0.10000000000000001.

Ответ 6

Если вам нужно только 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

Так много уродства...

Моим личным фаворитом является преобразование float, для которого не требуется float (= когда они на самом деле являются целыми числами) до int, тем самым удаляя, теперь бесполезный, завершающий 0

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

Затем вы можете распечатать их в обычном режиме.

Ответ 8

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

Ответ 9

Чтобы напечатать float, который имеет целочисленное значение как int:

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

Пример

             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

Ответ 11

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

Ответ 12

Следующий код преобразует содержимое переменной no, так как это i.e. 45.60. Если вы используете str, выход будет 45.6

no = 45.60

strNo = "%.2f" %no

Ответ 13

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

Ответ 14

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.

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

Ответ 15

Я имел дело со значением из json-словаря (возвращаемого API). Все вышеперечисленное не помогло мне, поэтому я построил собственную вспомогательную функцию. Он усекает все конечные нули.

Я надеюсь, что это поможет кому-то там.

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

Отпечатки:

    0.000000363

Ответ 16

Наберите 0 prcision и добавьте период, если хотите. EG "%.0f."

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