Отображение цены - PullRequest
2 голосов
/ 30 июля 2011

Я получаю цены в разных валютах и ​​хочу отобразить бразильский R $ Мое форматирование не работает, и дисплей выглядит так:

Цена: 1,15..000., 00 р.

Для хорошей гибкости я сохранил цену в виде строки: 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 ]

5 голосов
/ 30 июля 2011

Хранение цены в виде строки является первой проблемой.Это должен быть десятичный.Если вы посмотрите документацию стандартной библиотеки Python для Decimal, вы увидите это http://docs.python.org/library/decimal.html#recipes

Этот рецепт moneyfmt должен делать то, что вы хотите

2 голосов
/ 21 февраля 2013

Вы можете использовать locale._override_localeconv dict, чтобы установить свои собственные перезаписи:

>>> 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'

Вы можете использовать эту строку locale._override_localeconv.update({'p_cs_precedes': 1, 'n_cs_precedes': 1}) сразу после import locale, если хотите.

2 голосов
/ 30 июля 2011

Форматирование валюты является функцией locale .

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

...