может кто-нибудь сказать мне, что не так с этим кодом...
def format_money_value(num):
return u'{0:.2f}'.format(num)
Это дает мне следующую ошибку:
Unknown format code 'f' for object of type 'unicode'
Я запускаю Django 1.5
Спасибо
может кто-нибудь сказать мне, что не так с этим кодом...
def format_money_value(num):
return u'{0:.2f}'.format(num)
Это дает мне следующую ошибку:
Unknown format code 'f' for object of type 'unicode'
Я запускаю Django 1.5
Спасибо
В вашем случае num
является строкой unicode, которая не поддерживает модификатор формата f
:
>>> '{0:.2f}'.format(u"5.0")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'f' for object of type 'unicode'
Вы можете исправить ошибку, сделав преобразование в float
самостоятельно:
>>> '{0:.2f}'.format(float(u"5.0"))
'5.00'
Как указано в mgilson, когда вы выполняете '{0:.2f}'.format(num)
, метод format
строк вызывает num.__format__(".2f")
. Это приводит к ошибке для str
или unicode
, потому что они не знают, как обращаться с этим спецификатором формата. Обратите внимание, что значение f
остается как реализация для объекта. Для числовых типов это означает преобразование числа в представление строки с плавающей запятой, но другие объекты могут иметь разные соглашения.
Если вы использовали оператор форматирования %
, поведение отличается, потому что в этом случае %f
вызывает __float__
напрямую, чтобы получить представление с плавающей точкой объекта.
Это означает, что при использовании форматирования %
-style f
имеет определенное значение, которое должно преобразовываться в представление строки с плавающей точкой.
str.format
метод вызывает метод __format__()
связанного типа. Это означает
<type>.__format__(<value>, <spec>)
выше метод принимает аргумент того же типа, что и первое значение, и принимает подходящий тип spec
как второй. Как,
str.__format__('1', 's')
int.__format__(1, 'f')
float.__format__(1.00, 'f')
str.__format__
принимает любой тип, полученный из типа str
, например str
или unicode
. Значение Spec должно быть допустимым форматом, который можно использовать для этого типа. В результате повышается ошибка
str.__format__('1', 'f')
ValueError: Unknown format code 'f' for object of type 'str'
поскольку floating point
форматирование не является подходящей строкой типа fot. Подобным образом также будет вызывать ошибку.
float.__format__(1.00, 's')
ValueError: Unknown format code 's' for object of type 'float'
поскольку float является типом numeric
и не может быть отформатирован как string
. Но следующие действия действительны:
float.__format__(1.00, 'g')
float.__format__(1.00, 'f')
аналогичным образом будет вызывать исключение
float.__format__(1.00, 'd')
ValueError: Unknown format code 'd' for object of type 'float'
поскольку форматирование точки с плавающей точкой до десятичного значения приведет к потере значений точности. Но форматирование int
до float
не приведет к такому веществу, поэтому оно является допустимым преобразованием:
int.__format__(1, 'f')
Итак, .format()
лимитируется до specs
, доступного для соответствующего форматирования type
. Вы должны проанализировать свое значение как @Bakuriu:
'{0:.2f}'.format(float(u"5.0"))
У меня возникла аналогичная проблема с OP, когда num
был числовым ответом, возвращенным одной из моих библиотек, чья реализация detais забыли:
>>> num
-4132.56528214700
>>> u'{0:.4g}'.format(num)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'g' for object of type 'unicode'
Я действительно был озадачен, потому что num
вел себя как float, но после тестирования решения @Bakuriu я обнаружил, что это не плавающий:
>>> type(num)
<class 'sympy.core.numbers.Float'>
Итак, решение @Bakuriu было правильным для моего случая:
>>> u'{0:.4g}'.format(float(num))
u'-4133'
Следовательно, ошибка может быть вызвана типами, которые отображают/вычисляют, но не являются плавающими.