2011-07-30 168 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

作爲一個字符串銷售每盎司的清單,可能還有其他我應該承認的組合。我沒有想到一個正則表達式或規則,不會讓某人不可能出售例如金屬每盎司 –

回答

5

存儲的價格作爲一個字符串是第一個問題。它應該是一個十進制。如果你看一下小數Python標準庫文件,你會看到這個http://docs.python.org/library/decimal.html#recipes

這moneyfmt食譜應該做你想做的

+0

謝謝!你是對的,我可能應該選擇一個數字數據類型來存儲價格,但是這樣做的缺點是,它不會允許「價格」與諸如「10盎司」或「A combinar」或「Negotiable」假設我有一個缺點。也許我可以嘗試將數值轉換爲數字,如果投射效果好,那麼我使用moneyfmt,這樣我仍然可以允許我沒有想到的上市價格。 –

+1

以價格,數量和單位制作課程。許多價格將像1234.56,1,但一些將是10,1,onça。對於真正奇怪的你可以使用負數或.01。例如.01,1,combi意味着「A combinar」和.01,1,neg。您可以定義所需的所有單位,並根據單位進行特殊處理。 –

+0

+1的詳細評論邁克爾狄龍 –

2
+0

謝謝。我確實直接保存了哪種貨幣,以便巴西的文章可以按照美元列出。所以我想這一切取決於我希望我的實現有多靈活。 –

+1

@Niklas R:「這一切都取決於我希望我的實現有多靈活」。不可以。區域設置始終用於格式化貨幣,無論您的應用程序是非常靈活還是不靈活。區域設置始終是貨幣格式化的方式。 –

+0

我明白了。對我來說Locale是英語的EN,例如英語,而貨幣類似USD。我只是不想排除即使「locale」是巴西的「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