誰かがこのコードの何が問題なのか教えてもらえますか...
def format_money_value(num):
return u'{0:.2f}'.format(num)
次のエラーが表示されます。
Unknown format code 'f' for object of type 'unicode'
私はDjango 1.5を実行しています
ありがとうございました
あなたの場合、フォーマット修飾子num
をサポートしていないユニコード文字列です: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
オブジェクトの実装として残されていることに注意してください。数値型の場合、数値を浮動小数点文字列表現に変換することを意味しますが、他のオブジェクトには異なる規則がある場合があります。
書式設定演算子を使用した場合、オブジェクトの浮動小数点表現を取得するために直接呼び出す%
ため、動作が異なります。つまり、-style フォーマットを使用する場合、浮動小数点文字列表現に変換するという特定の意味があります。%f
__float__
%
f
str.format
__format__()
メソッドは、関連する型のメソッドを呼び出します 。つまり
<type>.__format__(<value>, <spec>)
上記のメソッドは、最初の値と同じ型引数を受け入れ、spec
2 番目の値として適切な型を受け入れます。お気に入り、
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
ではないためです。同様に、以下もエラーが発生します
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'
浮動小数点を 10 進数値にフォーマットすると、精度値が失われるためです。int
ただし、 toをフォーマットしてfloat
もそのようなことは起こらないため、有効な変換です。
int.__format__(1, 'f')
そのため、関連する書式設定で利用できることに.format()
制限されています。@Bakuriu が定義したように値を解析する必要があります。specs
type
'{0:.2f}'.format(float(u"5.0"))