Modulul locale
În formatul implicit al numerelor, Python folosește sistemul anglo-saxon, în care miile sunt separate prin virgule, iar partea zecimală este separată de partea întreagă prin punct. În Europa continentală, de exemplu, se folosește un alt sistem, în care miile sunt separate prin punct, iar partea zecimală de partea întreagă prin virgulă:
# sistemul anglo-saxon
1,234.567
# sistemul european
1.234,567
Pentru a rezolva problema formatării în funcție de o anumită cultură, Python include modulul integrat locale.
Pentru a seta cultura locală, în modulul locale este definită funcția setlocale(), care acceptă doi parametri:
setlocale(category, locale)
Primul parametru indică categoria la care se aplică funcția - pentru numere, valute sau pentru ambele. Ca valoare pentru acest parametru, putem transmite una dintre următoarele constante:
- LC_ALL: aplică localizarea la toate categoriile - pentru formatul numerelor, valutelor, datelor etc
- LC_NUMERIC: aplică localizarea pentru numere
- LC_MONETARY: aplică localizarea pentru valute
- LC_TIME: aplică localizarea pentru date și ore
- LC_CTYPE: aplică localizarea la conversia caracterelor în majuscule sau minuscule
- LC_COLLATE: aplică localizarea la compararea șirurilor de caractere
Al doilea parametru al funcției setlocale specifică cultura locală care trebuie utilizată. Pe sistemele Windows, se poate folosi codul țării conform standardului ISO din două caractere, de exemplu, pentru Statele Unite - "us", pentru Germania - "de", pentru România - "ro". Pe MacOS, trebuie specificat codul limbii și codul țării, de exemplu, pentru engleză în Statele Unite - "en_US", pentru germană în Germania - "de_DE", pentru română în România - "ro_RO". Implicit, se utilizează cultura "en_US".
Pentru formatul numerelor și valutelor, modulul locale oferă două funcții:
- currency(num): formatează valuta
- format_string(str, num): înlocuiește numărul num în șirul str
Se folosesc următorii placeholderi:
- d: pentru numere întregi
- f: pentru numere cu virgulă mobilă
- e: pentru scrierea exponențială a numerelor
Înaintea fiecărui placeholder se pune semnul procent %, de exemplu:
"%d"
La afișarea numerelor zecimale, după punct, înainte de placeholder, se poate specifica câte zecimale să fie afișate:
%.2f # două zecimale
Să aplicăm localizarea pentru numere și valute în cultura germană:
import locale
locale.setlocale(locale.LC_ALL, "de") # pentru Windows
# locale.setlocale(locale.LC_ALL, "de_DE") # pentru MacOS
number = 12345.6789
formatted = locale.format_string("%f", number)
print(formatted) # 12345,678900
formatted = locale.format_string("%.2f", number)
print(formatted) # 12345,68
formatted = locale.format_string("%d", number)
print(formatted) # 12345
formatted = locale.format_string("%e", number)
print(formatted) # 1,234568e+04
money = 234.678
formatted = locale.currency(money)
print(formatted) # 234,68 €
Dacă, în loc de un cod specific, al doilea parametru este un șir gol, Python va folosi cultura care este utilizată pe mașina curentă. Cu ajutorul funcției getlocale() se poate obține această cultură:
import locale
locale.setlocale(locale.LC_ALL, "")
number = 12345.6789
formatted = locale.format_string("%.02f", number)
print(formatted) # 12345,68
print(locale.getlocale())
# ('Romanian_Romania', '1251') - Windows
# ('ro_RO', 'UTF-8') - MacOS
Este important de menționat că, în funcție de sistem, rezultatul afișat poate diferi.