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

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

Вступление

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

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

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus