Python: как конвертировать валюту в десятичную?

У меня есть доллары в строковой переменной

dollars = '$5.99'

Как я могу преобразовать это в десятичную вместо строки, чтобы я мог делать операции с ним, как добавление долларов к нему?

9 ответов

Решение

Есть простой подход:

dollar_dec = float(dollars[1:])

Если вы предпочитаете просто целое число центов:

cents_int = int(round(float(dollars.strip('$'))*100))

Если вы хотите десятичный, просто используйте...

from decimal import Decimal
dollars_dec = Decimal(dollars.strip('$'))

Если вы знаете, что знак доллара всегда будет там, вы можете использовать dollars[1:] вместо dollars.strip('$'), но используя strip() позволяет также обрабатывать строки, в которых отсутствует знак доллара (5.99 вместо $5.99).

Предполагая строку, хранящуюся в переменной dollars был сгенерирован с использованием модуля языка Python. Потенциально более чистый способ преобразования его обратно в число с плавающей запятой (десятичное) заключается в использовании atof функция из того же модуля. Это должно работать до тех пор, пока вы используете тот же setlocale параметры в обоих направлениях (от валюты к строке и наоборот).

например:

import locale
locale.setlocale(locale.LC_ALL, '')
value = 122445.56
value_s = locale.currency(value, grouping=True)
#generates $122,445.56

преобразовать его обратно:

value2 = locale.atof(value_s[1:])
#value2 = 122445.56 
value == value2 #True

Я знаю, что это старый вопрос, но это очень простой подход к вашей проблеме, который легко читается:

за:

dollars = '$5.99'
dollars = dollars.replace("$","").replace(",","")
/* 5.99 */

Он также работает с большим числом, в котором может быть запятая:

dollars = '1,425,232.99'
dollars = dollars.replace("$","").replace(",","")
/* 1425232.99 */

Если вы хотите использовать десятичное число:

from decimal import Decimal
dollars = Decimal(dollars.strip('$'))

Оттуда добавление довольно просто

dollars += 1 # Would add 1 to your decimal

Через десятичный пакет

>>> dollars = '$5.99'
>>> import decimal
>>> decimal.Decimal(dollars[1:])
Decimal('5.99')
>>> 

Если вы собираетесь только добавлять (а не умножать или делить), подумайте о том, чтобы просто хранить центы вместо долларов и не использовать десятичный пакет. Я предлагаю использовать самый простой инструмент для работы, и десятичная дробь не дает никакой ценности, если вы просто добавляете доллары и центы.

Сначала удалите символ "$". Если это всегда последовательно первый персонаж, это легко:

dollars[1:]

Чтобы поддерживать идеальные центы, не беспокоясь о неидеальном представлении центов в плавающей запятой, вы должны использовать десятичные значения:

from decimal import *
Decimal(dollars[1:])

Если вы хотите хранить деньги в центах для удобства округления, а иногда отсутствует знак $:

for dollars in ('$5.99','6.77'):
    cents = int(float((dollars[1:] if dollars.startswith('$') else dollars))*100)
    print '%s = %i cents = %i dollars and %i cents' % ((dollars, cents)+divmod(cents, 100))

Вот еще один пример преобразования грязной строки валюты в десятичную, округленную до цента:

from decimal import Decimal, ROUND_DOWN

messy = ',   $1, 111.2199  ,,,'

less_messy = Decimal(''.join(messy.replace(',','').split()).replace('$',''))
converted = less_messy.quantize(Decimal(".01"), rounding=ROUND_DOWN)

print(converted)
1111.21

Другие варианты округления включают в себя: ROUND_HALF_UP, ROUND_HALF_DOWN, ROUND_UP

Другие вопросы по тегам