2010-06-01 2 views
16

У меня есть следующий код в Django:Проблемы пытаются форматировать валюту с Python (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' 

я .. не получаю it.i

+0

Посмотрите на библиотеку [babel] (http://babel.edgewall.org/): http://babel.edgewall.org/wiki/ApiDocs/0.9/babel.numbers – codeape

+1

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

ответ

22

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

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

вместо

locale.setlocale(locale.LC_ALL, '') 

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

+0

Работал. Благодаря ! –

+4

У меня была такая же проблема, и я попробовал это, но получил неизвестную ошибку locale setlocalte() ing. Я попробовал его на оболочке manage.py, и он сказал, что локаль была «en_US.UTF-8». Итак, я попробовал 'local.setlocale (locale.LC_ALL, 'en_US.UTF-8')', и он работал безупречно. Спасибо, что помог мне в правильном направлении! – Furbeenator

2

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

+4

Мне кажется, что это немного усугубляет то, что я в конечном итоге говорю о потоках, когда хочу только форматировать число. Я думаю, что они не должны были использовать обернутые библиотеки C в первых местах, это, кажется, вызывает больше проблем, чем решение. –

0

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

3

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

Currency formatting is not possible using the 'C' locale.

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

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

1

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

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 пользователя, запускающего приложение webserver или python, добавьте две вышеуказанные строки в профиль bash и перезапустите сеанс терминала, запустите сервер и вуаля.

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

Смежные вопросы