2010-06-01 60 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配置文件中,重新啓動終端會話,啓動服務器,並瞧。

希望這可以幫助別人。