使用Python(Django)格式化货币时遇到的问题

27 投票
6 回答
19950 浏览
提问于 2025-04-15 23:25

我在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 个回答

2

http://docs.python.org/library/locale.html#locale.setlocale 上说这个功能在多线程环境下不是线程安全的。这意味着在开发服务器上使用它可能没什么问题,但如果在生产服务器上运行,特别是当有多个线程同时工作时,就可能会遇到麻烦!

6

我遇到了一个类似的问题,就是在用PyCharm(JetBrain的IDEA 12基础的开发工具)运行Django应用时,出现了这样的提示:

使用'C'区域设置无法进行货币格式化。

但当我用命令 python manage.py runserver 来运行时,一切都正常。经过一番查找,我发现有个讨论提到了环境变量 LC_ALL,你可以在这里找到。

结果发现,如果你编辑“运行配置”,并添加一个环境变量,就能正常工作了。下面是截图。希望这能帮助到遇到同样问题的人。

Locale Setting Environment Variable
40

在生产服务器上,试试

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

而不是

locale.setlocale( locale.LC_ALL, '' )

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

撰写回答