Модуль locale

Последнее обновление: 04.02.2022

При форматировании чисел 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", для России - "ru". Но на MacOS необходимо указывать код языка и код страны, например, для английского в США - "en_US", для немецкого в Германии - "de_DE", для русского в России - "ru_RU". По умолчанию фактически используется культура "en_US".

Непосредственно для форматирования чисел и валют модуль locale предоставляет две функции:

  • currency(num): форматирует валюту

  • format_string(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_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 €

Если вместо конкретного кода в качестве второго параметра передается пустая строка, то Python будет использовать культуру, которая применяется на текущей рабочей машине. А с помощью функции getlocale() можно получить эту культуру:

import locale

locale.setlocale(locale.LC_ALL, "")

number = 12345.6789
formatted = locale.format_string("%.02f", number)
print(formatted)    # 12345,68
print(locale.getlocale())   
# ('Russian_Russia', '1251') - Windows
# ('ru_RU', 'UTF-8')  - MacOS

Стоит отметить, что в зависимости от системы вывод может отличаться.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850