Проблемы при попытке отформатировать валюту с помощью Python (Django) - PullRequest
18 голосов
/ 01 июня 2010

У меня есть следующий код в Django:

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

def format_currency(i):
    return locale.currency(float(i), grouping=True)

Он работает на некоторых компьютерах в режиме разработки, но как только я пытаюсь развернуть его в рабочей среде, я получаю эту ошибку:

Exception Type: TemplateSyntaxError
Exception Value: Caught ValueError while rendering: Currency formatting is not possible using the 'C' locale.
Exception Location: /usr/lib/python2.6/locale.py in currency, line 240

Странно то, что я могу сделать это на рабочем сервере, и он будет работать без ошибок:

python manage.py shell
>>> import locale 
>>> locale.setlocale( locale.LC_ALL, '' )
'en_CA.UTF-8'
>>> locale.currency(1, grouping=True)
'$1.00'

Я .. не понимаю.i

Ответы [ 6 ]

25 голосов
/ 02 июня 2010

На рабочем сервере попробуйте

locale.setlocale( locale.LC_ALL, 'en_CA.UTF-8' )

вместо

locale.setlocale( locale.LC_ALL, '' )

Когда вы используете '', для локали устанавливается значение по умолчанию (обычно указывается переменной окружения LANG). На рабочем сервере это выглядит как «C», а в качестве тестового пользователя - «en_CA.UTF-8».

4 голосов
/ 20 февраля 2013

Я столкнулся с подобной проблемой, когда я запускал приложение Django через PyCharm (IDE JetBrain на основе IDEA 12), оно получало ту же проблему

Форматирование валюты невозможно с использованием локали 'C'.

, где к тому времени он нормально работал, python manage.py runserver работал бы просто отлично. После некоторых копаний я нашел обсуждение темы о переменной окружения LC_ALL здесь

И оказалось, что если вы отредактируете «Запустить конфигурацию» и добавите переменную окружения, все будет работать нормально. Смотрите скриншот ниже. Надеюсь, что это помогает другим, кто сталкивается с той же проблемой. Locale Setting Environment Variable

2 голосов
/ 02 июня 2010

http://docs.python.org/library/locale.html#locale.setlocale говорит, что он не является поточно-ориентированным, что не должно быть проблемой при запуске сервера dev, но может вызвать проблемы при его запуске на рабочем сервере в многопоточной среде!

1 голос
/ 08 мая 2016

Я знаю, что это старый, но у меня была эта проблема, и я смог продолжать использовать:

locale.setlocale( locale.LC_ALL, '' )

Поскольку я хотел иметь возможность запускать этот код на машине с Windows, Linux и Mac OSX. Приведенная выше строка должна работать с Windows-машиной по умолчанию, но не с Mac или Linux-машиной. Если вы используете рабочий сервер с Apache, вам нужно настроить пользователя, работающего с сервисом Apache , с желаемой локалью. Для этого (по крайней мере, в Ubuntu) перейдите в / etc / apache2 / и отредактируйте файл envvars. Там вы увидите, что по умолчанию эта строка имеет вид:

export LANG=C

По этой причине вы получаете ошибку, замените ее на:

export LANG=en_CA.UTF-8
export LC_ALL=en_CA.UTF-8

Перезапустите Apache, и вы будете правы, как дождь.

Если вы не используете apache и получаете эту ошибку, вам просто нужно обновить .bash_profile или .profile пользователя, работающего с веб-сервером или приложением python, добавьте две вышеупомянутые строки в профиль bash и перезапустите терминальная сессия, запусти сервер и вуаля.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 07 апреля 2019

Я получал то же сообщение об ошибке, используя Djano, Nginx и uwsgi. Чтобы окружение, в отличие от просто Django, использовало правильную локаль, мне пришлось добавить строку в wsgi.py:

wsgi.py

os.environ['LC_ALL'] = "en_GB.UTF-8"

(Примечание: в моем случае я использовал британское, а не американское форматирование валюты, поэтому использовал _GB. Для вступления изменений в силу может потребоваться перезапуск соответствующих служб)

0 голосов
/ 30 августа 2012

У меня была такая же проблема. Это работало в оболочке (manage.py shell), но не из MVT. Мне пришлось использовать locale.setlocale(locale.LC_ALL, 'en_US.UTF-8'), потому что, очевидно, у меня не было en_CA.UTF-8 локали. Обратите внимание на en_US..., а не en_CA. Просто хотел добавить ответ, потому что он снова поймал меня после восстановления и должен был найти комментарий, чтобы исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...