Вступление
Необходимость вручную форматировать число как строку валюты может быть утомительным процессом. Вам может потребоваться внести всего несколько строк изменений, однако, когда нам нужно сделать изрядное количество преобразований, это становится очень утомительным.
Первый шаг к автоматизации подобных задач потребует наличия функции. В этой статье мы рассмотрим несколько методов, которые вы можете использовать для форматирования чисел в виде строк валюты в Python .
Способы форматирования чисел
Мы рассмотрим три альтернативные библиотеки и функции, которые позволяют конвертировать числа в денежные строки:
Модуль 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 , пожалуй, один из малоизвестных методов, но он очень удобный и интуитивно понятный. Он включает в себя форматирование чисел и валют, а также другие задачи по интернационализации.
В отличие от locale
Python, вам не нужно беспокоиться о внесении
изменений в глобальном масштабе.
Чтобы установить 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 для достижения более широкого спектра применения. В конце я надеюсь, что вы смогли узнать из всего этого что-то новое, что поможет вам сэкономить время.