'unicode'类型对象的未知格式代码'f'

Mar*_*rkO 25 python django

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

def format_money_value(num):
    return u'{0:.2f}'.format(num)
Run Code Online (Sandbox Code Playgroud)

它给了我以下错误:

Unknown format code 'f' for object of type 'unicode'
Run Code Online (Sandbox Code Playgroud)

我正在运行Django 1.5

谢谢

Bak*_*riu 21

在你的情况下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'
Run Code Online (Sandbox Code Playgroud)

您可以修复错误,使转换为您float自己:

>>> '{0:.2f}'.format(float(u"5.0"))
'5.00'
Run Code Online (Sandbox Code Playgroud)

正如mgilson所指出的那样'{0:.2f}'.format(num),format字符串调用的方法num.__format__(".2f").这会导致错误,str或者unicode因为他们不知道如何处理此格式说明符.请注意,其含义f保留为对象的实现.对于数字类型,它表示将数字转换为浮点字符串表示形式,但其他对象可能具有不同的约定.

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


Fal*_*gel 5

什么.format()呢

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

<type>.__format__(<value>, <spec>)
Run Code Online (Sandbox Code Playgroud)

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

str.__format__('1', 's')
int.__format__(1, 'f')
float.__format__(1.00, 'f')
Run Code Online (Sandbox Code Playgroud)

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

str.__format__('1', 'f')
ValueError: Unknown format code 'f' for object of type 'str'
Run Code Online (Sandbox Code Playgroud)

因为floating point格式化不是一个合适的格式类型fot字符串.同样,以下也会引发错误

float.__format__(1.00, 's')
ValueError: Unknown format code 's' for object of type 'float'
Run Code Online (Sandbox Code Playgroud)

因为float是一个numeric类型,不能格式化为string.但以下都是有效的:

float.__format__(1.00, 'g')
float.__format__(1.00, 'f')
Run Code Online (Sandbox Code Playgroud)

以下同样会引发异常

float.__format__(1.00, 'd')
ValueError: Unknown format code 'd' for object of type 'float'
Run Code Online (Sandbox Code Playgroud)

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

int.__format__(1, 'f')
Run Code Online (Sandbox Code Playgroud)

所以.format()被limeted到specs这是提供给相关的格式化type.你必须解析你的价值@Bakuriu定义:

'{0:.2f}'.format(float(u"5.0"))
Run Code Online (Sandbox Code Playgroud)