尝试使用Python格式化货币的问题(Django)

时间:2010-06-01 19:44:53

标签: python django

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

我......没有得到它。我

6 个答案:

答案 0 :(得分:25)

在生产服务器上,尝试

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

而不是

locale.setlocale( locale.LC_ALL, '' )

使用''时,语言环境设置为用户的默认值(通常由LANG环境变量指定)。在生产服务器上,它看起来是'C',而作为测试用户,它似乎是'en_CA.UTF-8'。

答案 1 :(得分:4)

我遇到了类似的问题,我通过PyCharm运行Django应用程序(JetBrain的基于IDEA 12的IDE),它遇到了同样的问题

  

使用“C”语言环境无法进行货币格式化。

然后运行python manage.py runserver它运行正常可以正常工作。经过一番挖掘后,我找到了关于环境变量LC_ALL here

的线程讨论

事实证明,如果您编辑“运行配置”并添加环境变量,它将正常工作。见下面的截图。希望这有助于遇到同样问题的其他人。 Locale Setting Environment Variable

答案 2 :(得分:2)

http://docs.python.org/library/locale.html#locale.setlocale表示它不是线程安全的,这不应该是运行dev服务器的问题,但是可能会导致在多线程环境中在生产服务器上运行它时出现问题!

答案 3 :(得分: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并且你得到了那个错误,那么你只需要更新运行webserver或python应用程序的用户的.bash_profile或.profile,将以上两行添加到bash配置文件并重新启动终端会话,启动服务器并瞧。

希望这有助于某人。

答案 4 :(得分:0)

我遇到了同样的问题。它在shell(manage.py shell)中工作,但不在MVT中工作。我不得不使用locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')因为显然我没有en_CA.UTF-8语言环境。请注意en_US...而不是en_CA。只是想添加答案,因为它在重建后再次抓住了我,并且必须找到评论来解决它。

答案 5 :(得分:0)

我在使用Djano,Nginx和uwsgi时收到了相同的错误消息。为了获得环境(而不是Django)以使用正确的语言环境,我必须在wsgi.py中添加一行:

wsgi.py

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

(注意:在我的情况下,我使用的是英国而不是美国的_GB货币格式。为了使更改生效,可能需要重新启动相关服务)