При форматировании чисел 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(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')