26

谁能告诉我这段代码有什么问题...

def format_money_value(num):
    return u'{0:.2f}'.format(num)

它给了我以下错误:

Unknown format code 'f' for object of type 'unicode'

我正在运行 Django 1.5

谢谢

4

4 回答 4

22

在您的情况下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"). 这会导致stror出错unicode,因为他们不知道如何处理此格式说明符。请注意, 的含义f保留为对象的实现。对于数字类型,这意味着将数字转换为浮点字符串表示形式,但其他对象可能有不同的约定。

如果您使用%格式化运算符,则行为会有所不同,因为在这种情况下直接%f调用__float__以获取对象的浮点表示。这意味着在使用%-style 格式时f 确实有一个特定的含义,即转换为浮点字符串表示形式。

于 2013-04-10T11:57:23.673 回答
5

.format() 做什么

str.format方法调用 __format__()相关类型的方法。这意味着

<type>.__format__(<value>, <spec>)

上面的方法接受与第一个值相同的类型参数,并接受一个合适的spec类型作为第二个值。喜欢,

str.__format__('1', 's')
int.__format__(1, 'f')
float.__format__(1.00, 'f')

str.__format__接受从类型派生的任何类型str,例如strunicode。规范值必须是该类型可用的有效格式化程序。以下将引发错误

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'

因为将浮点数格式化为十进制值会导致精度值丢失。但是格式化一个inttofloat不会导致这样的事情,所以它是一个有效的转换:

int.__format__(1, 'f')

所以.format()仅限于specs相关格式可用type。您必须按照@Bakuriu 的定义解析您的值:

'{0:.2f}'.format(float(u"5.0"))
于 2013-04-10T12:36:27.607 回答
1

将字符串(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)
于 2018-05-30T17:28:15.293 回答
0

我遇到了与 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'

因此,错误可能是由于类型显示/计算类似于但不是真正的浮点数。

于 2015-09-13T04:21:44.627 回答