显示价格
我正在处理不同货币的价格,想要显示巴西雷亚尔(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
更新:我在考虑使用这些过滤器中的某一个:
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)
3 个回答
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})
这一行代码。
2
货币格式化是一个和 地区设置 相关的功能。
你可以在这里找到更多信息:http://docs.python.org/library/locale.html#locale.currency
5
把价格存成字符串是个问题。价格应该用小数(Decimal)来表示。如果你查看一下Python标准库中关于小数的文档,你会看到这个链接:http://docs.python.org/library/decimal.html#recipes
里面的moneyfmt这个方法应该能满足你的需求。