ukotvit menu |
V Pythonu nám locale zpřístupňuje modul locale. Tento modul obsahuje řadu funkcí, konstant a datových položek. Některé z nich jsou nedokumentované a jsou závislé na implementaci Pythonu, to jest nevyskytují se všude. Z těch dokumentovaných se to týká funkce nl_langinfo(), která chybí například ve windows, protože tato funkce chybí v implementaci locale samotných windows. Tyto používejte jen při zkoumání Pythonu a locale, nikoli v produkční aplikaci u které nemáte pod kontrolou, kde se spouští. Některé věci jsou v Pythonu implementovány trochu jinak než v jazyku C. V Pythonu není implementována funkce strfmon() pro práci s měnou, místo ní poskytuje funkci currency(). Na formátování čísel nabízí Python funkci format(), která nemá v C obdobu.
Zde popíšu jen ty nejdůležitější funkce, o zbytku si přečtěte originální dokumentaci.
setlocale(category, locale=None)
Funkce setlocale() nastavuje aplikaci její locale.
Parametr category slouží pro zadání kategorie pro kterou locale nastavujeme. Hodnotou je jedna z konstant LC_* které jsou definovány v modulu locale.
Parametr locale je nepovinný a lze nastavit na 3 způsoby. 1) Není-li zadán nebo je none, pak vrací aktuální nastavení locale aplikace. 2) Je-li to prázdný řetězec, pak nastaví aplikaci na defaultní systémové locale. 3) Může být zadán řetězec konkrétního locale.
Řetězec má standardizovaný formát (který Windows nedodržují):
jazyk[_země][.kódování][@modifikátor]
Pozor, zadané locale musí být přítomno v operačním systému, jinak
nastavení selže s chybou:
locale.Error: unsupported locale setting.
V linuxu seznam přítomných locale zjistíte příkazem locale -a, ve windows to pravděpodobně není možné uživatelsky zjistit.
Správné názvy locale v Linuxu jsou cs_CZ (používá iso-8859-2) a cs_CZ.utf8. Ve Windows je Czech_Czech Republic.1250. K těmto názvům locale existují ještě alternativní, které se přeloží na ty uvedené. Pro Linux i Windows lze použít například czech ve Windows cz.
Lokalizovaná náhrada cmp() pro porovnávání řetězců. Porovná dva řetězce a vrací -1, 0 nebo 1 podle toho, který je větší dle národních zvyklostí. Lze použít například s metodou sort() pro setřídění seznamu podle českých pravidel. Viz. příklad.
Funkce pro formátování čísel. Formát se řídí klasickými % pravidly (viz. formátování řetězců). Hodnota je číslo které chceme formátovat. Nelze formátovat více čísel najednou. Je-li parametr skupiny True, tak je číslo rozděleno na skupiny pomocí oddělovacího znaku. V českém prostředí to je po tisících a oddělovacím znakem je nezlomitelná mezera.
Pozor: Ve Windows 2K je v českém locale chybně uvedena desetinná tečka místo čárky! A dále u všech Windows je nutno dát pozor na to, že v konzoli používají kódování CP852, kdežto locale systém nastavuje pro CP1250 v kterém také probíhá vstup/výstup. Důsledkem je, že oddělovač tisíců – nezlomitelná mezera (v CP1250 znak s kódem 0x0a) – se v konzoli zobrazuje jako znak á (v CP852 znak s kódem 0x0a).
Stejně tak budou vadné lokalizované názvy dnů a měsíců. Je to chyba lokalizace Windows, která nelze systémově řešit a jediné řešení spočívá v ručním překódování. K tomu ale musí programátor vědět v jakém kódování je které locale. To lze naštěstí zjistit funkcí getpreferredencoding().
>>> import locale as l >>> l.setlocale(l.LC_ALL, "C") 'C' >>> print l.format("%f", 1234567.1, True) 1234567.100000 >>> l.setlocale(l.LC_ALL, "us") 'English_United States.1252' >>> print l.format("%f", 1234567.1, True) 1,234,567.100000 >>> l.setlocale(l.LC_ALL, "") 'Czech_Czech Republic.1250' >>> print l.format("%f", 1234567.1, True) 1á234á567.100000 >>> print l.format("%f", 1234567.1, True).decode("CP1250") 1 234 567.100000 >>> print l.format("%f", 1234567.1, True).decode(l.getpreferredencoding()) 1 234 567.100000
Další, méně využívané, funkce jsou popsány v dokumentaci.
Ukázky použítí jsou v příkladech.