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

18

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

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)) - это именно то, чего я пытаюсь избежать, пожалуйста, не предлагайте этого.

    
задан georg 22.11.2012 в 12:19
источник
  • @MartijnPieters Возможно, потому что он округляет, а не обрезает? Формат «{: .0f}». (1234.5678) - «1235», а не «1234». –  Blckknght 22.11.2012 в 12:26
  • Что делать, если преобразование float в int () или усечение это единственные параметры? Следующим шагом является создание настраиваемого подкласса float () для настройки формата .__ format __ () hook. –  Martijn Pieters♦ 22.11.2012 в 12:31
  • Почему вы исключаете правильное решение? –  Stefano Palazzo 23.03.2017 в 11:23
  • Мне любопытно, почему int (some_float) - это то, чего вы пытаетесь избежать, но ваш принятый ответ - это сложное обходное решение, которое делает именно это. Первое кажется гораздо легче понять и сохранить. –  Andrew Cottrell 02.06.2017 в 18:58
  • @AndrewCottrell: это почти через 5 лет, так что трудно сказать, почему я так хотел тогда;) Вероятно, чтобы сделать {some_var: d} работать без дополнительных преобразований. –  georg 02.06.2017 в 21:26

3 ответа

11

Можно расширить стандартный язык форматирования строк, расширив класс 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"
    
ответ дан bereal 22.11.2012 в 14:49
12

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

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 , вы не можете избежать какого-либо преобразования для печати в нужном формате.

    
ответ дан Óscar López 22.11.2012 в 12:25
-9

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

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

После выполнения теста% timeit выглядит так: функция trunc из математической библиотеки выполняется быстрее, поэтому math.trunc будет предпочтительнее, если вам нужно форматировать многие числа таким образом.     

ответ дан John Volk 03.12.2015 в 09:35
  • Ух .. это действительно плохая техника –  Vlad 20.01.2017 в 02:11