2010-06-01 40 views
16

Tôi có đoạn code sau trong Django:vấn đề cố gắng để định dạng tiền tệ với Python (Django)

import locale 
locale.setlocale(locale.LC_ALL, '') 

def format_currency(i): 
    return locale.currency(float(i), grouping=True) 

Nó làm việc trên một số máy tính trong chế độ dev, nhưng ngay sau khi tôi cố gắng để triển khai nó đến sản xuất tôi nhận được lỗi này:

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 

điều lạ là tôi có thể làm điều này trên các máy chủ sản xuất và nó sẽ làm việc mà không có bất kỳ lỗi:

python manage.py shell 
>>> import locale 
>>> locale.setlocale(locale.LC_ALL, '') 
'en_CA.UTF-8' 
>>> locale.currency(1, grouping=True) 
'$1.00' 

tôi .. không nhận được nó.Tôi

+0

Hãy xem thư viện [babel] (http://babel.edgewall.org/): http://babel.edgewall.org/wiki/ApiDocs/0.9/babel.numbers – codeape

+1

Tôi đã có cùng vấn đề. Nó hoạt động trong shell (manage.py shell), nhưng không phải từ MVT. Tôi đã phải sử dụng 'locale.setlocale (locale.LC_ALL, 'en_US.UTF-8')' vì rõ ràng, tôi không có ngôn ngữ 'en_CA.UTF-8'. – Furbeenator

Trả lời

22

Trên máy chủ sản xuất, thử

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

thay vì

locale.setlocale(locale.LC_ALL, '') 

Khi bạn sử dụng '', miền địa phương được thiết lập để mặc định của người dùng (thường được chỉ định bởi biến môi trường LANG). Trên máy chủ sản xuất, dường như là 'C', trong khi với tư cách là người dùng thử, nó xuất hiện là 'en_CA.UTF-8'.

+0

Đã hoạt động. Cảm ơn ! –

+4

Tôi đã gặp vấn đề tương tự và đã thử điều này, nhưng có một lỗi locale lỗi không xác định() ing. Tôi đã thử nó trên vỏ manag.py và nó cho biết miền địa phương là 'en_US.UTF-8'. Vì vậy, tôi đã thử 'local.setlocale (locale.LC_ALL, 'en_US.UTF-8')' và nó hoạt động hoàn hảo. Cảm ơn đã giúp tôi đi đúng hướng! – Furbeenator

2

http://docs.python.org/library/locale.html#locale.setlocale nói rằng nó không an toàn cho luồng, không nên là vấn đề khi chạy máy chủ dev, nhưng có thể khiến bạn gặp sự cố khi chạy trên máy chủ sản xuất trong môi trường nhiều luồng!

+4

Tôi tìm thấy nó một chút trầm trọng hơn mà tôi kết thúc nói về chủ đề khi tôi chỉ muốn định dạng một số. Tôi nghĩ rằng họ không nên sử dụng thư viện C bọc ở những nơi đầu tiên, nó dường như gây ra nhiều vấn đề hơn là giải quyết. –

0

Tôi đã gặp sự cố tương tự. Nó hoạt động trong shell (manage.py shell), nhưng không phải từ MVT. Tôi đã phải sử dụng locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') vì rõ ràng, tôi không có miền địa phương en_CA.UTF-8. Lưu ý en_US... như trái ngược với en_CA. Chỉ muốn thêm câu trả lời bởi vì nó bắt gặp tôi một lần nữa sau khi xây dựng lại và phải tìm nhận xét để sửa nó.

3

Tôi chạy vào một vấn đề tương tự mà tôi chạy ứng dụng Django qua PyCharm (JetBrain của IDEA 12 dựa IDE), nó đã nhận được cùng một vấn đề của

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

nơi như nó làm việc tốt bởi sau đó chạy python manage.py runserver sẽ chỉ làm việc tốt. Sau một số lần đào, tôi đã tìm thấy một cuộc thảo luận về biến môi trường LC_ALLhere

Và nó bật ra nếu bạn chỉnh sửa "Chạy cấu hình" và thêm biến môi trường, nó sẽ hoạt động tốt. Xem ảnh chụp màn hình bên dưới. Hy vọng điều này sẽ giúp những người khác gặp phải cùng một vấn đề. Locale Setting Environment Variable

1

Tôi biết đây là một cái cũ, nhưng tôi có vấn đề này và tôi đã có thể tiếp tục sử dụng:

locale.setlocale(locale.LC_ALL, '') 

Như tôi muốn để có thể chạy mã này trên một máy Windows, Linux máy và máy mac osx. Dòng trên sẽ hoạt động với máy tính theo mặc định, nó sẽ không có máy mac hoặc linux. Nếu bạn đang chạy máy chủ sản xuất với apache, bạn sẽ cần phải thiết lập người dùng chạy dịch vụ apache với ngôn ngữ mà bạn mong muốn. Để thực hiện việc này (trong ubuntu ít nhất) hãy truy cập/etc/apache2/và chỉnh sửa tệp "envvars". Bạn sẽ thấy trong đó nó có dòng này theo mặc định:

export LANG=C 

Đó là lý do bạn nhận được lỗi, thay đổi này để:

export LANG=en_CA.UTF-8 
export LC_ALL=en_CA.UTF-8 

Khởi động lại apache và bạn sẽ có ngay như mưa.

Nếu bạn không chạy apache và bạn nhận được lỗi đó thì bạn chỉ cần cập nhật .bash_profile hoặc .profile của người dùng đang chạy máy chủ web hoặc ứng dụng python, thêm hai dòng trên vào hồ sơ bash và khởi động lại phiên đầu cuối, khởi động máy chủ và thì đấy.

Hy vọng điều này sẽ giúp ai đó.

Các vấn đề liên quan