2011-07-30 15 views
2

私は、異なる通貨での価格を取得し、ブラジルのRは$ 私の書式設定が動作しません表示すると、表示は次のようになりますよ:表示価格

価格:1.15..000、00 R $

私は文字列として価格を保存した良好な柔軟性のために

:私は私自身のフィルタを実装しようとしましたが、それは動作しませんでしたprice=db.StringProperty(verbose_name="price")

{{ ad.price|separate }} R$

def separate(n, sep='.'): 
    ln = list(str(n)) 
    ln.reverse() 
    newn = [] 
    while len(ln) > 3: 
     newn.extend(ln[:3]) 
     newn.append(sep) 
     ln = ln[3:] 
    newn.extend(ln) 
    newn.reverse() 
    return "".join(newn) 

私を助けることができますか?フィルタを削除するだけですか?代わりに入力に正規表現を適用する必要がありますか?自分のサイトへのリンクはhttp://www.koolbusiness.com/servead/4252196

UPDATEです:私は、これらのフィルタのいずれかのようなものを使用して検討している:

import locale 
locale.setlocale(locale.LC_ALL, '') 

def currency(value): # doesn't work 
    locale.setlocale(locale.LC_ALL, '') 
    return locale.currency(value, grouping=True) 

register.filter(currency) 


def currencyWithoutUsingLocale(value): # needs adjustment 
    value=float(value) 
    symbol = '$' 
    thousand_sep = '' 
    decimal_sep = '' 
    # try to use settings if set 
    try: 
     symbol = settings.CURRENCY_SYMBOL 
    except AttributeError: 
     pass 

    try: 
     thousand_sep = settings.THOUSAND_SEPARATOR 
     decimal_sep = settings.DECIMAL_SEPARATOR 
    except AttributeError: 
     thousand_sep = ',' 
     decimal_sep = '.' 

    intstr = str(int(value)) 
    f = lambda x, n, acc=[]: f(x[:-n], n, [(x[-n:])]+acc) if x else acc 
    intpart = thousand_sep.join(f(intstr, 3)) 
    return "%s%s%s%s" % (symbol, intpart, decimal_sep, ("%0.2f" % value)[-2:]) 

register.filter(currencyWithoutUsingLocale) 
+1

「うまくいきませんでした」というのはあまり役に立ちません。あなたが試したときに何が起こったのですか? –

+0

1オンスあたりの販売はストリングとしてリストされていますが、私は認めなければならない他の組み合わせがあるかもしれません。私は誰かが売るなど不可能にならないような正規表現やルールを考えるのに失敗します。 1オンスあたりの金属 –

答えて

5

文字列が第一の課題であるとして、価格を保存します。それは10進数でなければなりません。あなたは十進のためのPythonの標準ライブラリのドキュメントを見れば、あなたはmoneyfmtレシピはあなたの書式

+0

ありがとう!あなたはおそらく、私はおそらく価格を格納するための数値データ型を選択する必要がありますが、その欠点は、 "オンス当たり10ドル"や "コンビナート"や "交渉可能"などの単語で "価格"を許可しないことです私が取ることができる欠点があるとします。たぶん私は数値にキャストしようとすることができますし、鋳造がうまくいけば、私はmoneyfmtを使用して、私はまだ私が考えなかった上場価格を許可することができます。 –

+1

クラスを価格、数量、単位で作成します。多くの価格は1234.56,1のようになりますが、一部は10,1、onçaになります。本当に奇妙なものについては、負の数または.01を使うことができます。例えば、.01,1の場合、combiは "A combinar"と.01,1、negを意味します。ユニットに基づいて必要なユニットをすべて定義し、特別な処理を行います。 –

+0

詳細なコメントはMichael Dillon –

2

通貨はlocaleの機能です。欲しいものを行う必要があり、このhttp://docs.python.org/library/decimal.html#recipes

が表示されます

http://docs.python.org/library/locale.html#locale.currency

+0

ありがとうございます。ブラジルからの記事が必要な場合は、米ドルで表示されるように、私はそれが直接通貨を保存します。だから私はこれがすべて私の実装をしたい柔軟性に依存していると思います。 –

+1

@Niklas R: "これは、実装の柔軟性に依存します。"いいえ。ロケールは、アプリケーションの柔軟性や柔軟性にかかわらず、常に通貨の書式設定用です。ロケールは常に通貨のフォーマット方法です。 –

+0

私は理解しています。私には、通貨は米ドルのようなものですが、ロケールは英語のENです。ブラジルの「ロケール」が「pt」または「pt-br」または「pt_br」であっても、ブラジルのユーザー、ブラジルのユーザー、ブラジルのユーザーは除外されませんポルトガルは依然として「米ドル」で価格設定された商品を掲示することができた。柔軟性が必要ない場合は、通貨を国と同じに設定することができます。私が経度と緯度を知っていれば、私は自分の国の通貨よりも他の通貨を許可すれば、それはユーザーに完全になる可能性があるので、どの通貨がわからないかもしれません。 –

2

あなたはあなた自身の上書きを設定するlocale._override_localeconv辞書を使用することができます:あなたがしたい場合

>>> import locale 
>>> locale.setlocale(locale.LC_MONETARY, 'pt_BR.UTF-8') 
>>> locale.currency(1234.56) 
'1234,56 R$' 
>>> locale._override_localeconv.update({'p_cs_precedes': 1, 'n_cs_precedes': 1}) 
>>> locale.currency(1234.56) 
'R$ 1234,56' 

あなたは、右のimport locale後、このlocale._override_localeconv.update({'p_cs_precedes': 1, 'n_cs_precedes': 1})ラインを使用することができます。

+1

btw、Decimalを使用して、テキストではなくお金を保存するのを忘れないでください。 – alanjds

関連する問題