2010-06-01 65 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' 

我..没有得到它。我

+0

看看[babel](http://babel.edgewall.org/)图书馆:http://babel.edgewall.org/wiki/ApiDocs/0.9/babel.numbers – codeape 2010-06-01 20:40:06

+1

我有同样的问题。它在shell(manage.py shell)中工作,但不是来自MVT。我不得不使用'locale.setlocale(locale.LC_ALL,'en_US.UTF-8')',因为显然,我没有'en_CA.UTF-8'语言环境。 – Furbeenator 2011-12-12 20:51:55

回答

22

在生产服务器上,尝试

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

,而不是

locale.setlocale(locale.LC_ALL, '') 

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

+0

工作。谢谢 ! – 2010-06-01 20:12:03

+4

我遇到了同样的问题,并尝试了这一点,但得到了一个未知的语言环境错误setlocalte()ing。我在manage.py shell上试了一下,它说locale是'en_US.UTF-8'。所以,我尝试了'local.setlocale(locale.LC_ALL,'en_US.UTF-8')',它的工作完美无瑕。感谢您让我走向正确的方向! – Furbeenator 2011-12-12 20:50:19

2

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

+4

当我只想格式化一个数字时,我发现它最终导致讨论线程时有点恶化。 我认为他们不应该在第一个地方使用包装的C库,它似乎会导致比解决更多的问题。 – 2010-06-01 20:10:28

0

我遇到了同样的问题。它在shell(manage.py shell)中工作,但不是来自MVT。我必须使用locale.setlocale(locale.LC_ALL, 'en_US.UTF-8'),因为显然,我没有en_CA.UTF-8区域设置。请注意0​​而不是en_CA。只是想添加答案,因为它在重建后再次抓到我,并且必须找到注释才能解决问题。

3

我遇到了,我通过PyCharm(JetBrain的IDEA 12基于IDE)运行Django应用程序类似的问题,当时天色地方,因为它工作得很好,届时运行python manage.py runserver

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

相同问题将只是工作正常。经过一番挖掘,我发现了一个关于环境变量的讨论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,并且你得到那个错误,那么你只需要更新运行web服务器或python应用程序的用户的.bash_profile或.profile,将上面两行添加到bash配置文件中,重新启动终端会话,启动服务器,并瞧。

希望这可以帮助别人。