Модуль 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')