Форматирование строк с помощью «{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 
  • str.format () вызывает KeyError
  • Как мне преобразовать дату и время python в строку с датой чтения?
  • Что означает «h» в строке формата python?
  • Как я могу отформатировать десятичную цифру, чтобы всегда показывать 2 десятичных знака?
  • IndexError: индекс tuple вне диапазона при аргументах метода анализа
  • Python, строковый формат, newline (C ++ - std :: endl)
  • Строка форматирования Python "}" fill
  • Выравнивание формата строки Datetime
  •  
    Interesting Posts for Van-Lav

    Доступ Python Anywhere к базе данных MySQL запрещен

    Pandas to_csv с цитированием = 3 (QUOTE_NONNUMERIC) не работает

    Существуют ли какие-либо рекомендации для выбора количества процессов с многопроцессорной обработкой?

    Маршрутизация всех пакетов через мою программу?

    Можно ли получить «высокую отметку воды» использования памяти из Python?

    Способы избежать ошибок MySQLdb «Команды не синхронизированы; вы не можете запустить эту команду сейчас »(2014) исключение

    Как построить 32-битное распределение модулей Python с помощью Setup.py на хосте x86_64

    Добавление серии pandas с разными индексами без получения NaN

    Печать переменной во встроенном интерпретаторе Python

    Как найти номер версии psycopg2

    Возможно ли технически сделать скриншот веб-сайта программным путем?

    python exit бесконечный цикл с исключением KeyboardInterrupt

    почему мой код не расшифровывает зашифрованную строку на основе словаря?

    Возврат функции Python

    Сохранение профиля Firefox в нескольких тестах Selenium без указания профиля

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