сбросив трейлинг '.0' с поплавков - PullRequest
41 голосов
/ 22 декабря 2008

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

65 голосов
/ 22 августа 2012

См. 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'
17 голосов
/ 22 декабря 2008

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']
8 голосов
/ 30 декабря 2008
>>> x = '1.0'
>>> int(float(x))
1
>>> x = 1
>>> int(float(x))
1
7 голосов
/ 22 декабря 2008
(str(i)[-2:] == '.0' and str(i)[:-2] or str(i) for i in ...)
7 голосов
/ 22 декабря 2008
def floatstrip(x):
    if x == int(x):
        return str(int(x))
    else:
        return str(x)

Однако помните, что Python представляет 0,1 как неточное число с плавающей точкой в ​​моей системе 0.10000000000000001.

5 голосов
/ 22 августа 2013

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

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

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

Тогда вы можете распечатать их как обычно.

4 голосов
/ 22 декабря 2008

Если вы заботитесь только о 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'
3 голосов
/ 06 июня 2013

Для печати 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
3 голосов
/ 22 декабря 2008
from decimal import Decimal
'%g' % (Decimal(str(x)))
1 голос
/ 27 июня 2017

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

no = 45.60

strNo = "%.2f" %no
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...