Форматирование строк с помощью «{0: d}» не преобразуется в целое число

Это касается той же проблемы, что и в этом вопросе о поплавках .

Когда у вас есть значение, которое может быть преобразовано в целое число, старый %d преобразует его, но формат не работает.

 class MyIntegerTenClass: def __int__(self): return 10 def __str__(self): return 'ten' ten = MyIntegerTenClass() print '%d, %02X, %s' % (ten, ten, ten) # ok print '{0}'.format(ten) # ok print '{0:d}, {0:02X}'.format(ten) # ValueError: Unknown format code 'd' for object of type 'str' 

Есть ли способ изменить поведение формата, не касаясь класса форматируемого значения (без добавления метода __format__ к этому классу)?

Изменить. Моя цель – получить форматирование в зависимости от строки формата, но не от значения. Поэтому, если в строке формата указано «d» или «x», преобразуйте значение в int, а затем в десятичное или шестнадцатеричное представление. Если строка формата говорит «s», преобразуйте ее в строку напрямую. Как сказал старый % .

Фактически, я мог бы даже добавить метод __format__ к классу значения. Но как я могу проверить в этом методе, если указанная спецификация формата является спецификацией целочисленного формата? Без переопределения синтаксического анализатора формата встроенного формата.

Изменить: Вот решение с __format__ и исключениями. Любые лучшие идеи?

 class MyIntegerTenClass: def __int__(self): return 10 def __str__(self): return 'ten' def __format__(self, spec): fmt = '{0:%s}'%spec try: return fmt.format(str(self)) except: return fmt.format(int(self)) ten = MyIntegerTenClass() print '%d, %02X, %s' % (ten, ten, ten) # ok, prints "10, 0A, ten" print '{0:d}, {0:02X}, {0}'.format(ten) # ok, prints "10, 0A, ten" 

3 Solutions collect form web for “Форматирование строк с помощью «{0: d}» не преобразуется в целое число”

Первым подходом к этой проблеме может быть просто try :

 class MyIntegerTenClass: def __int__(self): return 10 def __str__(self): return 'ten' def __format__(self, format_spec): try: s = format(str(self), format_spec) except ValueError: s = format(int(self), format_spec) return s 

Если MyIntegerTenClass можно вставить в строку формата в виде строки, это будет. Если нет, он будет преобразован в int и повторно представлен в format .

 >>> print '{0}, {0:s}, {0:d}, {0:02X}, {0:f}'.format(ten) ten, ten, 10, 0A, 10.000000 

Если вы хотите, чтобы представление по умолчанию было 10 вместо ten , вам нужно только поменять строки преобразования:

  def __format__(self, format_spec): try: s = format(int(self), format_spec) except ValueError: s = format(str(self), format_spec) return s 

Выход теста:

 >>> print '{0}, {0:s}, {0:d}, {0:02X}, {0:f}'.format(ten) 10, ten, 10, 0A, 10.000000 

В качестве дополнения я не считаю, что вы сможете получить __format__ поведение без определения __format__ ; однако вы можете разработать более сложный подход, используя объект Formatter . Тем не менее, я думаю, что основанный на исключениях подход дает вам множество встроенных функций бесплатно.

передайте целое число вместо строки, и оно будет работать нормально.

 >>> print '{0:d}'.format(1) 1 >>> print '{0:d}'.format('1') Traceback (most recent call last): File "<pyshell#57>", line 1, in <module> print '{0:d}'.format('1') ValueError: Unknown format code 'd' for object of type 'str' 

Он говорит, что десять – это строка, вы пытаетесь отформатировать ее как число.

Попробуйте обернуть его в бросок:

 >>> print '{0:d}, {0:02X}'.format(int(ten)) 10, 0A 
  • строка формата python разделитель тысяч с пробелами
  • Использование .format () для форматирования списка с аргументами ширины поля
  • Лучший способ форматировать целое число как строку с ведущими нулями?
  • Как преобразовать экранированные символы в Python?
  • Тип и формат sys.exc_info () в Python 2.71
  • python: точки в имени переменной в строке формата
  • Python: форматирование выходной строки, выравнивание по правому краю
  • Строковый формат: Начать научную нотацию с 0. для положительного числа, с -. для отрицательного числа
  •  
    Interesting Posts for Van-Lav

    Как получить ключ словаря как переменную непосредственно в Python (не путем поиска по значению)?

    Установка rpy2 без прав администратора

    Индексы элементов в массиве Numpy, которые удовлетворяют условиям для значения и индекса

    Значение использования запятых и символов подчеркивания с помощью оператора назначения Python?

    Как получить n-граммовые collocations и ассоциации в python nltk?

    FFMpeg пишет анимацию matplotlib с уменьшающимся качеством

    Python: удалить несколько символов в списке строк

    Установка пакета pip из Jupyter Notebook не работает

    Почему удаление другого замедляет мой код?

    Улучшение извлечения человеческих имен с помощью nltk

    django: как получить значение от CharField и ModelChoiceField

    использование pandas для выбора строк, обусловленных множественными эквивалентами

    Тесты и структура пакета python

    ведущее подчеркивание в именах классов Python

    Как проверить пароль Windows с помощью cmd или python?

    Python - лучший язык программирования в мире.