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