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

Формат усеченного Python float как int в строке

Быстрое беспроблемное:

some_float = 1234.5678
print '%02d' % some_float  # 1234

some_float = 1234.5678
print '{WHAT?}'.format(some_float) # I want 1234 here too

Примечание: {:.0f} не является опцией, поскольку он округляет (возвращает в этом примере 1235).

format(..., int(some_float)) - это именно то, что я пытаюсь избежать, пожалуйста, не предлагайте этого.

4b9b3361

Ответ 1

Можно расширить стандартный язык форматирования строк, расширив класс string.Formatter:

class MyFormatter(Formatter):
    def format_field(self, value, format_spec):
        if format_spec == 't':  # Truncate and render as int
            return str(int(value))
        return super(MyFormatter, self).format_field(value, format_spec)

MyFormatter().format("{0} {1:t}", "Hello", 4.567)  # returns "Hello 4"

Ответ 2

Это работает:

from math import trunc
some_float = 1234.5678

print '{:d}'.format(trunc(some_float))
=> 1234

Или просто сделайте это, если на то пошло:

print trunc(some_float)
=> 1234

Я думаю, что это приемлемый ответ, он избегает преобразования в int. Обратите внимание, что в этом фрагменте: '%02d' % some_float происходит неявное преобразование в int, вы не можете избежать какого-либо преобразования для печати в нужном формате.

Ответ 3

Стоит упомянуть встроенное поведение при отображении чисел с плавающей запятой с использованием строк необработанного формата. Если вы заранее знаете, где находится ваша дробная часть относительно 0,5, вы можете использовать форматную строку, на которую вы изначально пытались, но обнаружили, что она не оправдала себя от побочных эффектов округления "{:0.0f}". Посмотрите на следующие примеры...

>>> "{:0.0f}".format(1.33)
'1'
>>> "{:0.0f}".format(1.500)
'2'
>>> "{:0.0f}".format(1.53)
'2'
>>> "{:0.0f}".format(1.999)
'2'
>>> "{:0.0f}".format(0.501)
'1'
>>> "{:0.0f}".format(0.5)
'0'
>>> "{:0.0f}".format(0.1)
'0'
>>> "{:0.0f}".format(0.001)
'0'

Как вы можете видеть, поведение закругления за кадром. В моем случае, когда у меня была база данных, преобразовывающая целые числа в числа с плавающей точкой, я знал, что заранее имел дело с недробной частью, и хотел только визуализировать в html-шаблоне часть int с плавающей точкой в качестве обходного пути. Конечно, если вы не знаете заранее дробную часть, вам нужно сначала выполнить операцию усечения какого-либо рода в плавающей запятой.

Ответ 4

Это тоже будет работать:

some_float = 1234.5678
f = lambda x: str(x)[:str(x).find('.')]
print '{}'.format(f(some_float))
=> 1234

После выполнения теста% timeit похоже, что это немного быстрее, чем метод trunc.