python locale模块_使用python2.X的locale模块格式化数字和货币
任務(wù)是以一種支持區(qū)域設(shè)置的方式將數(shù)字、貨幣金額和日期格式化為unicode字符串。在
第一次天真的數(shù)字嘗試給了我們希望:Python 2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'English_Australia.1252'
>>> locale.format("%d", 12345678, grouping=True)
'12,345,678'
>>> locale.format(u"%d", 12345678, grouping=True)
u'12,345,678'
>>>
現(xiàn)在試試法語(yǔ):
^{pr2}$
這是怎么回事?在>>> locale.localeconv() # output edited for brevity
{'thousands_sep': '\xa0', 'mon_thousands_sep': '\xa0', 'currency_symbol': '\x80'}
哇!看起來(lái)有點(diǎn)老土。一個(gè)解決辦法表明:>>> locale.format("%d", 12345678, grouping=True).decode(locale.getpreferredencoding())
u'12\xa0345\xa0678'
>>>
更新1locale.getpreferredencoding()不是正確的方法;請(qǐng)使用locale.getlocale()[1]:Python 2.7 (r27:82525, Jul 4 2010, 09:01:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getpreferredencoding(), locale.getlocale()
('cp1252', (None, None))
>>> locale.setlocale(locale.LC_ALL, '')
'English_Australia.1252'
>>> locale.getpreferredencoding(), locale.getlocale()
('cp1252', ('English_Australia', '1252'))
>>> locale.setlocale(locale.LC_ALL, 'russian_russia')
'Russian_Russia.1251'
>>> locale.getpreferredencoding(), locale.getlocale()
('cp1252', ('Russian_Russia', '1251')) #### Whoops! ####
>>>
更新2strftime()系列和str.格式()>>> locale.setlocale(locale.LC_ALL, 'french_france')
'French_France.1252'
>>> format(12345678, 'n')
'12\xa0345\xa0678'
>>> format(12345678, u'n') # type triggers cast to unicode somehow
Traceback (most recent call last):
File "", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 2: ordinal not in range(128)
>>> import datetime;datetime.date(1999,12,31).strftime(u'%B') # type is ignored
'd\xe9cembre'
>>>
在所有情況下,解決方法是在調(diào)用這些方法時(shí)只使用str對(duì)象,獲得str結(jié)果,并使用locale.getlocale()[1]獲得的編碼對(duì)其進(jìn)行解碼
其他問(wèn)題:
(1)在測(cè)試/探索Windows語(yǔ)言環(huán)境名稱不僅與POSIX(“fr_-fr”)不同,而且冗長(zhǎng),而且沒(méi)有完全文檔化,這是一個(gè)相當(dāng)麻煩的問(wèn)題。例如,顯然印度的分組不是“每3位數(shù)”。。。我找不到可以用來(lái)探索的地方;像“印地語(yǔ)”和“印地語(yǔ)印度語(yǔ)”這樣的嘗試是行不通的。在
(2)有些localeconv()數(shù)據(jù)是完全錯(cuò)誤的。E、 g.對(duì)于韓語(yǔ),貨幣符號(hào)是'\\',即一個(gè)反斜杠。我知道一些7位舊字符集與ASCII不兼容,chr(92)有時(shí)用于本地貨幣符號(hào),所以我希望'\\'.decode('949')生成一個(gè)won符號(hào),而不僅僅是u'\\'
我知道像babel這樣的模塊,但我并不特別想強(qiáng)加一個(gè)像那樣的大的外部依賴。我能同時(shí)得到正確和方便嗎?關(guān)于locale模塊,我有什么遺漏嗎?在
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python locale模块_使用python2.X的locale模块格式化数字和货币的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python读取一个图像_从图像处理py
- 下一篇: python 期货交易_Python期货