谁能告诉我这段代码有什么问题...
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
or出错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
。规范值必须是该类型可用的有效格式化程序。以下将引发错误
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
tofloat
不会导致这样的事情,所以它是一个有效的转换:
int.__format__(1, 'f')
所以.format()
仅限于specs
相关格式可用type
。您必须按照@Bakuriu 的定义解析您的值:
'{0:.2f}'.format(float(u"5.0"))
将字符串(unicode 或其他)重新格式化为浮点字符串的场景不是很安全。您应该首先将字符串转换为数字表示形式,并且只有在成功后才能再次将其格式化为字符串。您无法控制进入程序的数据,因此您应该确保验证它是否进入。
如果您选择将其保留为字符串,则可以使用:
return u"{:.2f}".format(num) if num.isnumeric() else u"{}".format(num)
如果您已经将字符串转换为数字格式,则可以像这样调整格式化程序:
return u"{:.2f}".format(num) if isinstance(num, NumberTypes) else u"{}".format(num)
我遇到了与 OP 类似的问题,num
我的一个库何时返回了一个数字答案,其实现细节被遗忘了:
>>> 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
行为就像一个浮点数,但是在测试了@Bakuriu 的解决方案之后,我发现它不是一个浮点数:
>>> type(num)
<class 'sympy.core.numbers.Float'>
所以@Bakuriu 的解决方案对我来说是正确的:
>>> u'{0:.4g}'.format(float(num))
u'-4133'
因此,错误可能是由于类型显示/计算类似于但不是真正的浮点数。