Рубрики
Без рубрики

Как отформатировать число в виде строки валюты в Python

В этом уроке мы рассмотрим, как форматировать число в виде строки валюты в Python, используя встроенный метод str.format (), модуль locale и модуль Babel.

Автор оригинала: Daniel Pimeh.

Вступление

Необходимость вручную форматировать число в виде строки валюты может быть утомительным процессом. У вас может быть всего несколько строк изменений, однако, когда нам нужно сделать изрядное количество преобразований, это становится очень утомительным.

Первый шаг к автоматизации такого рода задач потребует наличия функции. В этой статье мы рассмотрим несколько методов, которые вы можете использовать для форматирования чисел как строк валюты в Python .

Методы форматирования чисел

Мы рассмотрим три альтернативные библиотеки и функции, которые позволяют нам конвертировать числа в строки валюты:

  • Модуль locale .
  • Модуль Babel .
  • Функция str.format () .

Модуль locale уже включен в Python, однако для его использования нам придется установить Babel.

Формат номера в виде строки валюты с локализацией

Модуль locale поставляется уже предустановленным вместе с вашей версией Python .

Этот пакет позволяет разработчикам локализовать свои приложения. Это означает, что им не нужно знать, в каком регионе будет работать их программное обеспечение, они могут просто написать универсальную кодовую базу, которая будет динамически меняться в зависимости от региона использования.

Инициализация локального

Чтобы начать использовать модуль locale , сначала необходимо установить языковой стандарт:

import locale 

# To use default settings, set locale to None or leave second argument blank.
print(locale.setlocale(locale.LC_ALL, ''))

# To use a specific locale (Great Britian's locale in this case)
print(locale.setlocale(locale.LC_ALL, 'en_GB'))

Приведенный выше код приведет к следующему результату:

English_United States.1252
en_GB

Чтобы получить список доступных локалей, вы можете посмотреть его на MS-LCID . Кроме того, вы можете распечатать его:

# For the Windows operating system 
for lang in locale.windows_locale.values():
        print(lang)

# For other operating systems
for lang in locale.locale_alias.values():
    	print(lang)

Запуск любого из вышеперечисленных вариантов приведет к чему-то похожему на:

en_GB
af_ZA
sq_AL
gsw_FR
am_ET
ar_SA
ar_IQ
ar_EG
ar_LY
ar_DZ
...

Форматирование чисел с помощью локали

С помощью предпочтительного набора языковых стандартов вы можете легко форматировать числовые строки:

locale.setlocale(locale.LC_ALL, '')

# If you'd like groupings - set grouping to True, else set it to false or leave it out completely
print(locale.currency(12345.67, grouping=True))
print(locale.currency(12345.67))

Запустив приведенный выше код, мы получим следующий вывод:

$12,345.67
$12345.67

Использование метода str.format()

Следующий метод, который мы рассмотрим, – это метод str.format () , который имеет то преимущество, что является самым простым:

number_string = 340020.8
# This portion is responsible for grouping the number
number_commas_only = "{:,}".format(number_string)
print(number_commas_only)

# To ensure we have two decimal places
number_two_decimal = "{:.2f}".format(number_string)
print(number_two_decimal)

# Both combined along with the currency symbol(in this case $)
currency_string = "${:,.2f}".format(number_string)
print(currency_string)

Запустив приведенный выше код, мы получим следующий вывод:

340,020.8
340020.80
$340,020.80

Таким образом, этот подход жестко закодирован, в отличие от предыдущего, который вы можете использовать для динамической локализации форматирования.

Форматирование номера в виде строки валюты с помощью Babel

Использование Babel , возможно, является одним из менее известных методов, однако он очень удобен и интуитивно понятен. Он поставляется с форматированием чисел и валют, а также другими задачами интернационализации.

В отличие от модуля Python locale , вам не нужно беспокоиться о внесении изменений в глобальном масштабе.

Чтобы установить Babel через pip , выполните следующую команду:

$ pip install Babel
...
Successfully installed Babel-2.9.0

После установки, чтобы достичь тех же результатов, что и два других метода, перечисленных выше, вы можете просто вызвать format_currency() в строке:

import babel.numbers
number_string = 340020.8

# The three needed arguements are the number, currency and locale
babel.numbers.format_currency(number_string, "USD", locale='en_US')

Запустив приведенный выше код, мы получим следующий вывод:

$340,020.80

Чтобы получить полный список доступных локалей:

avail_loc = babel.localedata.locale_identifiers()
print(avail_loc)

Что выглядит примерно так:

['af', 'af_NA', 'af_ZA', 'agq', 'agq_CM', 'ak', 'ak_GH', 'am', 'am_ET',...]

Поиск чисел в строках и Форматирование в качестве валюты

Иногда вы не работаете с прямым числовым вводом, таким как ввод от пользователя. Вы можете работать с предложением или большим, нечистым корпусом. Мы можем использовать модуль re для фильтрации различных типов входных данных, поиска числовых значений и их форматирования.

Давайте используем все три вышеприведенных подхода для форматирования валюты в предложении:

import re
import locale
import babel.numbers
locale.setlocale(locale.LC_ALL, 'en_US')

Далее мы придумываем шаблон регулярного выражения, необходимый для соответствия числовым строкам:

 # This pattern is used to match any number string
 pattern = r'\d+(\.\d{1,2})?'

Затем мы применяем три метода, которые мы изучили, к строковой переменной message :

message = "Our current budget is 180000, we'll need 25000.67 to cover rent, then 23400.4 for food."

# re.sub() is used to substitute substrings that match a certain pattern
# with another string, in our case the return value of a lambda function
# which will return a matching currency string.
new_message_locale = re.sub(
    pattern, lambda x: locale.currency(float(x.group()), grouping=True), message
)
new_message_str = re.sub(
    pattern, lambda x: "${:,.2f}".format(float(x.group())), message
)
new_message_babel = re.sub(
    pattern,
    lambda x: babel.numbers.format_currency(float(x.group()), "USD", locale="en_US"),
    message,
)

Давайте сравним исходный вывод с выводом, полученным из всех трех методов:

print(message)
print(new_message_locale)
print(new_message_str)
print(new_message_babel)
Our current budget is 180000, we'll need 25000.67 to cover rent, then 23400.4 for food.
Our current budget is $180,000.00, we'll need $25,000.67 to cover rent, then $23,400.40 for food.
Our current budget is $180,000.00, we'll need $25,000.67 to cover rent, then $23,400.40 for food.
Our current budget is $180,000.00, we'll need $25,000.67 to cover rent, then $23,400.40 for food.

В зависимости от метода, который вы предпочитаете, длина этого скрипта может быть уменьшена. Как вы, возможно, заметили, существуют определенные ограничения.

Скрипт, как он есть, не может различать числовые строки, которые вы хотите отформатировать. Однако его можно легко изменить в зависимости от ваших потребностей и вариантов использования.

Вывод

В этой статье мы рассмотрели несколько способов преобразования чисел в правильные валютные строки. Мы рассмотрели метод str.format () , а также модули locale и babel .

Наконец, мы объединили эти методы с модулем регулярных выражений Python для достижения более широкого спектра применений. В конце концов, я надеюсь, что вы смогли узнать что-то новое из всего этого, что может помочь вам сэкономить время.