2010-10-08 3 views

ответ

5

Там легкий подход:

dollar_dec = float(dollars[1:]) 
+6

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

+1

AKA Office Space; если вам повезет, вам не придется сжигать здание. – Chinasaur

16

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

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

Если вы хотите Decimal, просто использовать ...

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

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

+2

Если вы предпочитаете целое число центов, держать его неотъемлемой весь путь: 'D, C = dollars.strip («$») .split ('.', 2); cents = int (d) * 100 + int (c.strip() [: 2]) '. Конечно, это предполагает, что вы хотите округлить дробные цента до 0 (вставьте здесь шутер Супермена III здесь). –

+0

Десятичный вариант - тот, который нужно взять. Я бы сделал шутку в 2 цента, но уже поздно. –

4

Если вы хотите использовать Decimal:

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

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

dollars += 1 # Would add 1 to your decimal 
0

Во-первых, сдирать символ '$'. Если это всегда последовательно первый символ, это легко:

dollars[1:] 

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

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

Через десятичного пакет

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

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

0

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

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)) 
11

Предполагая строку, хранящуюся в переменной dollars был создан с использованием языкового модуля python. Потенциально более чистый способ конвертировать его обратно в float (decimal) - использовать функцию 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 
+0

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

0

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

для:

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

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

dollars = '1,425,232.99' 
dollars = dollars.replace("$","").replace(",","") 
/* 1425232.99 */ 
Смежные вопросы