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をサポートしていないユニコード文字列です: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

于 2013-04-10T11:57:23.673 に答える
5

.format() は何をしますか

str.format__format__()メソッドは、関連する型のメソッドを呼び出します 。つまり

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

上記のメソッドは、最初の値と同じ型引数を受け入れ、spec2 番目の値として適切な型を受け入れます。お気に入り、

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ではないためです。同様に、以下もエラーが発生します

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 が定義したように値を解析する必要があります。specstype

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