Модуль locale
При форматуванні чисел Python за замовчуванням використовує англосаксонську систему, при якій розряди цілого числа відокремлюються один від одного комами, а дрібна частина від цілої відокремлюється крапкою. У континентальній Європі, наприклад, використовується інша система, при якій розряди розділяються крапкою, а дрібна і ціла частина - коми:
# Англосаксонська система
1,234.567
# Європейська система
1.234,567
І для вирішення проблеми форматування під певну культуру в Python є вбудований модуль locale.
Для установки локальної культури в модулі locale визначена функція setlocale(). Вона приймає два параметри:
setlocale(category, locale)
Перший параметр вказує на категорію, до якої застосовується функція - до чисел, валют або і числам, і валютам. Як значення для параметра ми можемо передавати одну з наступних констант:
- LC_ALL: застосовує локалізацію до всіх категорій - до форматування чисел, валют, дат і т.д.
- LC_NUMERIC: застосовує локалізацію до числам
- LC_MONETARY: застосовує локалізацію до валют
- LC_TIME: застосовує локалізацію до дат і часу
- LC_CTYPE: застосовує локалізацію при перекладі символів в верхній або нижній регістр
- LC_COLLIATE: застосовує локаль при порівнянні рядків
Другий параметр функції setlocale вказує на локальну культуру, яку треба використовувати. На ОС Windows можна використовувати код країни по ISO з двох символів, наприклад, для США - "us", для Німеччини - "de", для України - "ua". Але на MacOS необхідно вказувати код мови і код країни, наприклад, для англійської в США - "en_US", для німецького в Німеччині - "de_DE", для української в Україні - "ua_UA". За замовчуванням фактично використовується культура "en_US".
Безпосередньо для форматування чисел і валют модуль locale надає дві функції:
- currency(num): форматує валюту
- format(str, num): підставляє число num замість плейсхолдера в рядок str
Застосовуються наступні плейсхолдери:
- d: для цілих чисел
- f: для чисел з плаваючою точкою
- e: для експоненційної запису чисел
Перед кожним плейсхолдером ставиться знак відсотка%, наприклад:
"% D"
При виведенні дрібних чисел перед плейсхолдером після точки можна вказати, скільки знаків у дробовій частині повинно відображатися:
% .2f # два знака в дробової частини
Застосуємо локалізацію чисел і валют в німецькій культурі:
import locale
locale.setlocale(locale.LC_ALL, "de") # для Windows
# Locale.setlocale(locale.LC_ALL, "de_DE") # для MacOS
number = 12345.6789
formatted = locale.format( "% f", number)
print(formatted) # +12345,678900
formatted = locale.format( "%. 2f", number)
print(formatted) # 12345,68
formatted = locale.format( "% d", number)
print(formatted) # 12345
formatted = locale.format( "% e", number)
print(formatted) # 1,234568e + 04
money = 234.678
formatted = locale.currency(money)
print(formatted) # 234,68 €
Якщо замість конкретного коду в якості другого параметра передається порожній рядок, то Python буде використовувати культуру, яка застосовується на поточній робочій машині. А за допомогою функції getlocale() можна отримати цю культуру:
import locale
locale.setlocale(locale.LC_ALL, "")
number = 12345.6789
formatted = locale.format("%. 02f", number)
print(formatted) # 12345,68
print(locale.getlocale()) # ('Russian_Russia', '1251')