diff --git a/modules/bnporc/backend.py b/modules/bnporc/backend.py
index 1302cab8..4a0685d9 100644
--- a/modules/bnporc/backend.py
+++ b/modules/bnporc/backend.py
@@ -21,6 +21,7 @@
# python2.5 compatibility
from __future__ import with_statement
+from decimal import Decimal
from datetime import datetime, timedelta
from weboob.capabilities.bank import ICapBank, AccountNotFound, Account, Recipient
@@ -108,7 +109,7 @@ class BNPorcBackend(BaseBackend, ICapBank, ICapMessages):
try:
assert account.isdigit()
assert to.isdigit()
- amount = float(amount)
+ amount = Decimal(amount)
except (AssertionError, ValueError):
raise AccountNotFound()
diff --git a/modules/bnporc/pages/accounts_list.py b/modules/bnporc/pages/accounts_list.py
index 06cdb33f..33faa476 100644
--- a/modules/bnporc/pages/accounts_list.py
+++ b/modules/bnporc/pages/accounts_list.py
@@ -18,6 +18,8 @@
# along with weboob. If not, see .
+from decimal import Decimal
+
from weboob.capabilities.bank import Account
from weboob.capabilities.base import NotAvailable
from weboob.tools.browser import BasePage, BrokenPageError
@@ -68,7 +70,7 @@ class AccountsList(BasePage):
return account
def _parse_amount(self, elem):
- return float(elem.text.replace('.', '').replace(',', '.').strip(u' \t\u20ac\xa0€\n\r'))
+ return Decimal(elem.text.replace('.', '').replace(',', '.').strip(u' \t\u20ac\xa0€\n\r'))
def get_list(self):
l = []
diff --git a/modules/boursorama/pages/account_history.py b/modules/boursorama/pages/account_history.py
index bfcd6c0d..4018055b 100644
--- a/modules/boursorama/pages/account_history.py
+++ b/modules/boursorama/pages/account_history.py
@@ -19,6 +19,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
from datetime import date
from weboob.tools.browser import BasePage
@@ -55,9 +56,9 @@ class AccountHistory(BasePage):
amount = tds[4].text
amount = amount.strip(u' \n\t\x80').replace(' ', '').replace(',', '.')
- # if we don't have exactly one '.', this is not a floatm try the next
+ # if we don't have exactly one '.', this is not a Decimal try the next
operation = Transaction(len(self.operations))
- operation.amount = float(amount)
+ operation.amount = Decimal(amount)
operation.date = d
operation.label = label
diff --git a/modules/boursorama/pages/accounts_list.py b/modules/boursorama/pages/accounts_list.py
index e5d22506..4241ca68 100644
--- a/modules/boursorama/pages/accounts_list.py
+++ b/modules/boursorama/pages/accounts_list.py
@@ -19,6 +19,8 @@
# along with weboob. If not, see .
+from decimal import Decimal
+
from weboob.capabilities.bank import Account
from weboob.tools.browser import BasePage
@@ -55,9 +57,9 @@ class AccountsList(BasePage):
balance = span.text
balance = balance.strip(u' \n\t€+').replace(',', '.').replace(' ', '')
if balance != "":
- account.balance = float(balance)
+ account.balance = Decimal(balance)
else:
- account.balance = 0.0
+ account.balance = Decimal(0.0)
else:
# because of some weird useless
diff --git a/modules/bp/pages/accounthistory.py b/modules/bp/pages/accounthistory.py
index da85d630..6eb1ccbd 100644
--- a/modules/bp/pages/accounthistory.py
+++ b/modules/bp/pages/accounthistory.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
from datetime import date
import re
@@ -56,9 +57,9 @@ class AccountHistory(BasePage):
amount = t.text
amount = ''.join(amount.replace('.', '').replace(',', '.').split())
if amount[0] == "-":
- operation.amount = -float(amount[1:])
+ operation.amount = - Decimal(amount[1:])
else:
- operation.amount = float(amount)
+ operation.amount = Decimal(amount)
operations.append(operation)
return operations
diff --git a/modules/bp/pages/accountlist.py b/modules/bp/pages/accountlist.py
index 18e92cf0..0cb22e4e 100644
--- a/modules/bp/pages/accountlist.py
+++ b/modules/bp/pages/accountlist.py
@@ -18,8 +18,9 @@
# along with weboob. If not, see .
-from weboob.capabilities.bank import Account, AccountNotFound
+from decimal import Decimal
+from weboob.capabilities.bank import Account, AccountNotFound
from weboob.tools.browser import BasePage
@@ -59,7 +60,7 @@ class AccountList(BasePage):
tmp_balance = tmp[0].text
account.id = tmp_id
- account.balance = float(''.join(tmp_balance.replace('.','').replace(',','.').split()))
+ account.balance = Decimal(''.join(tmp_balance.replace('.','').replace(',','.').split()))
self.account_list.append(account)
def get_account(self, id):
diff --git a/modules/cmb/backend.py b/modules/cmb/backend.py
index 3dbddbff..7ffacdd7 100644
--- a/modules/cmb/backend.py
+++ b/modules/cmb/backend.py
@@ -28,6 +28,7 @@ from weboob.tools.browser import BrowserIncorrectPassword, BrokenPageError
from re import match, compile, sub
from httplib import HTTPSConnection
from urllib import urlencode
+from decimal import Decimal
from lxml import etree
from datetime import date
@@ -169,13 +170,13 @@ class CmbBackend(BaseBackend, ICapBank):
balance = td[1].text
balance = balance.replace(',', '.').replace(u"\xa0", '')
- account.balance = float(balance)
+ account.balance = Decimal(balance)
span = td[3].xpath('a/span')
if len(span):
coming = span[0].text.replace(' ', '').replace(',', '.')
coming = coming.replace(u"\xa0", '')
- account.coming = float(coming)
+ account.coming = Decimal(coming)
else:
account.coming = NotAvailable
@@ -262,10 +263,10 @@ class CmbBackend(BaseBackend, ICapBank):
if amount.count(',') != 1:
amount = td[4].text
amount = amount.replace(',', '.').replace(u'\xa0', '')
- operation.amount = float(amount)
+ operation.amount = Decimal(amount)
else:
amount = amount.replace(',', '.').replace(u'\xa0', '')
- operation.amount = - float(amount)
+ operation.amount = - Decimal(amount)
i += 1
yield operation
diff --git a/modules/cragr/pages/accounts_list.py b/modules/cragr/pages/accounts_list.py
index 10553085..7bf3aafb 100644
--- a/modules/cragr/pages/accounts_list.py
+++ b/modules/cragr/pages/accounts_list.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
from datetime import date
from weboob.capabilities.bank import Account
@@ -27,13 +28,13 @@ from weboob.capabilities.bank import Transaction
def clean_amount(amount):
"""
- Removes weird characters and converts to a float
+ Removes weird characters and converts to a Decimal
>>> clean_amount(u'1 000,00 $')
1000.0
"""
data = amount.replace(',', '.').replace(' ', '').replace(u'\xa0', '')
matches = re.findall('^(-?[0-9]+\.[0-9]{2}).*$', data)
- return float(matches[0]) if (matches) else 0.0
+ return Decimal(matches[0]) if (matches) else Decimal(0.0)
class AccountsList(CragrBasePage):
diff --git a/modules/creditmutuel/backend.py b/modules/creditmutuel/backend.py
index 82ec49bc..961469e2 100644
--- a/modules/creditmutuel/backend.py
+++ b/modules/creditmutuel/backend.py
@@ -19,6 +19,8 @@
from __future__ import with_statement
+from decimal import Decimal
+
from weboob.capabilities.bank import ICapBank, AccountNotFound, Recipient, Account
from weboob.tools.backend import BaseBackend, BackendConfig
from weboob.tools.value import ValueBackendPassword
@@ -78,7 +80,7 @@ class CreditMutuelBackend(BaseBackend, ICapBank):
try:
assert account.isdigit()
assert to.isdigit()
- amount = float(amount)
+ amount = Decimal(amount)
except (AssertionError, ValueError):
raise AccountNotFound()
diff --git a/modules/creditmutuel/pages.py b/modules/creditmutuel/pages.py
index d3f99b56..10191870 100644
--- a/modules/creditmutuel/pages.py
+++ b/modules/creditmutuel/pages.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
from weboob.tools.browser import BasePage
@@ -70,7 +71,7 @@ class AccountsPage(BasePage):
balance += c
if c == ',':
balance += '.'
- account.balance = float(balance)
+ account.balance = Decimal(balance)
l.append(account)
#raise NotImplementedError()
return l
@@ -135,7 +136,7 @@ class OperationsPage(BasePage):
balance += c
if c == ',':
balance += '.'
- operation.amount = float(balance)
+ operation.amount = Decimal(balance)
yield operation
def next_page_url(self):
diff --git a/modules/freemobile/pages/history.py b/modules/freemobile/pages/history.py
index ea8b169b..9123ec34 100644
--- a/modules/freemobile/pages/history.py
+++ b/modules/freemobile/pages/history.py
@@ -18,9 +18,11 @@
# along with weboob. If not, see .
+from datetime import datetime, date, time
+from decimal import Decimal
+
from weboob.tools.browser import BasePage
from weboob.capabilities.bill import Detail, Bill
-from datetime import datetime, date, time
__all__ = ['HistoryPage', 'DetailsPage']
@@ -30,9 +32,9 @@ def convert_price(div):
try:
price = div.find('div[@class="horsForfait"]/p/span').text
price = price.encode('utf-8', 'replace').replace('€', '').replace(',', '.')
- return float(price)
+ return Decimal(price)
except:
- return 0.
+ return Decimal(0)
class DetailsPage(BasePage):
@@ -118,9 +120,9 @@ class HistoryPage(BasePage):
detail.datetime = datetime.combine(mydate, mytime)
detail.label = tds[1].text.lstrip().rstrip() + " " + tds[2].text.lstrip().rstrip() + " " + tds[3].text.lstrip().rstrip()
try:
- detail.price = float(tds[4].text[0:4].replace(',', '.'))
+ detail.price = Decimal(tds[4].text[0:4].replace(',', '.'))
except:
- detail.price = 0.
+ detail.price = Decimal(0.0)
self.calls.append(detail)
diff --git a/modules/hsbc/pages/accounts.py b/modules/hsbc/pages/accounts.py
index 6e602b6d..3f120010 100644
--- a/modules/hsbc/pages/accounts.py
+++ b/modules/hsbc/pages/accounts.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
from weboob.tools.browser import BasePage
@@ -49,7 +50,7 @@ class AccountsListPage(BasePage):
tag = tds[2].find('font')
if tag is None:
tag = tds[2]
- account.balance = float(tag.text.replace('.','').replace(',','.').replace(' ', '').strip(u' \t\u20ac\xa0€\n\r'))
+ account.balance = Decimal(tag.text.replace('.','').replace(',','.').replace(' ', '').strip(u' \t\u20ac\xa0€\n\r'))
account.coming = NotAvailable
yield account
diff --git a/modules/ing/pages/account_history.py b/modules/ing/pages/account_history.py
index e9efae85..f6db83f0 100644
--- a/modules/ing/pages/account_history.py
+++ b/modules/ing/pages/account_history.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
from datetime import date
from weboob.tools.browser import BasePage
@@ -52,7 +53,7 @@ class AccountHistoryCC(BasePage):
amount = texte[5].replace('\t', '').strip().replace(u'€', '').\
replace(',', '.').replace(u'\xa0', u'')
- op.amount = float(amount)
+ op.amount = Decimal(amount)
self.transactions.append(op)
i += 1
@@ -81,7 +82,7 @@ class AccountHistoryLA(BasePage):
amount = texte[length - 1].replace('\t', '').strip().\
replace('.', '').replace(u'€', '').\
replace(',', '.').replace(u'\xa0', u'')
- op.amount = float(amount)
+ op.amount = Decimal(amount)
self.transactions.append(op)
i += 1
diff --git a/modules/ing/pages/accounts_list.py b/modules/ing/pages/accounts_list.py
index 544d87b5..cfc59054 100644
--- a/modules/ing/pages/accounts_list.py
+++ b/modules/ing/pages/accounts_list.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
from weboob.capabilities.bank import Account
@@ -46,8 +47,8 @@ class AccountsList(BasePage):
linkbis = self.document.xpath(urltofind).pop()
if linkbis.text == link.text:
linkbis = self.document.xpath(urltofind)[1]
- account.balance = float(linkbis.text.replace('.', '').\
- replace(' ', '').replace(',', '.'))
+ account.balance = Decimal(linkbis.text.replace('.', '').\
+ replace(' ', '').replace(',', '.'))
account.coming = NotAvailable
l.append(account)
diff --git a/modules/lcl/pages.py b/modules/lcl/pages.py
index 8a817dca..455dac0c 100644
--- a/modules/lcl/pages.py
+++ b/modules/lcl/pages.py
@@ -19,6 +19,8 @@
import base64
from datetime import date
+from decimal import Decimal
+
from weboob.capabilities.bank import Transaction
from weboob.capabilities.bank import Account
from weboob.tools.browser import BasePage, BrowserUnavailable
@@ -149,7 +151,7 @@ class AccountsPage(BasePage):
balance=a.text.replace(u"\u00A0",'').replace(' ','').replace('.','').replace('+','').replace(',','.')
if '-' in balance:
balance='-'+balance.strip().replace('-', '')
- account.balance=float(balance)
+ account.balance=Decimal(balance)
l.append(account)
return l
@@ -200,7 +202,7 @@ class AccountHistoryPage(BasePage):
mntColumn+=1
amount=u''.join([txt.strip() for txt in td.itertext()])
if amount != "":
- amount = float(amount.replace('.','').replace(',','.').replace(u"\u00A0",'').replace(' ',''))
+ amount = Decimal(amount.replace('.','').replace(',','.').replace(u"\u00A0",'').replace(' ',''))
if value.startswith("soldeDeb") or mntColumn==1:
amount=-amount
operation.amount=amount
diff --git a/modules/pap/pages.py b/modules/pap/pages.py
index 00a68a01..f452ae91 100644
--- a/modules/pap/pages.py
+++ b/modules/pap/pages.py
@@ -19,6 +19,7 @@
import re
+from decimal import Decimal
from dateutil.parser import parse as parse_date
from weboob.tools.browser import BasePage
@@ -53,9 +54,9 @@ class SearchResultsPage(BasePage):
housing.title = a.text.strip()
m = re.match('(\w+) (.+) (\d+)\xa0m\xb2 (.*)', housing.title)
if m:
- housing.area = float(m.group(3))
+ housing.area = Decimal(m.group(3))
- housing.cost = float(div.cssselect('td.prix')[0].text.strip(u' \t\u20ac\xa0€\n\r').replace('.', '').replace(',', '.'))
+ housing.cost = Decimal(div.cssselect('td.prix')[0].text.strip(u' \t\u20ac\xa0€\n\r').replace('.', '').replace(',', '.'))
housing.currency = u'€'
m = self.DATE_RE.match(div.cssselect('p.date-publication')[0].text.strip())
@@ -90,12 +91,12 @@ class HousingPage(BasePage):
parts = div.find('h1').text.split(' - ')
housing.title = parts[0].strip()
- housing.cost = float(parts[1].strip(u' \t\u20ac\xa0€\n\r').replace('.', '').replace(',', '.'))
+ housing.cost = Decimal(parts[1].strip(u' \t\u20ac\xa0€\n\r').replace('.', '').replace(',', '.'))
housing.currency = u'€'
m = re.match('(\w+) (.+) (\d+)\xa0m\xb2 (.*)', housing.title)
if m:
- housing.area = float(m.group(3))
+ housing.area = Decimal(m.group(3))
housing.date = housing.station = housing.location = housing.phone = NotAvailable
diff --git a/modules/prixcarburants/pages.py b/modules/prixcarburants/pages.py
index b6f96d4b..d1336402 100644
--- a/modules/prixcarburants/pages.py
+++ b/modules/prixcarburants/pages.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
from weboob.tools.browser import BasePage
@@ -59,7 +60,7 @@ class ComparisonResultsPage(BasePage):
price.product = product
tds = tr.findall('td')
- price.cost = float(tds[4].text.replace(',', '.'))
+ price.cost = Decimal(tds[4].text.replace(',', '.'))
price.currency = u'€'
shop = Shop(price.id)
diff --git a/modules/seloger/pages.py b/modules/seloger/pages.py
index 2ecf3dc6..ed55be4b 100644
--- a/modules/seloger/pages.py
+++ b/modules/seloger/pages.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
from dateutil.parser import parse as parse_date
from weboob.tools.browser import BasePage
@@ -41,9 +42,9 @@ class SearchResultsPage(BasePage):
housing = Housing(a.find('idannonce').text)
housing.title = a.find('titre').text
housing.date = parse_date(a.find('dtfraicheur').text)
- housing.cost = float(a.find('prix').text)
+ housing.cost = Decimal(a.find('prix').text)
housing.currency = u'€'
- housing.area = float(a.find('surface').text)
+ housing.area = Decimal(a.find('surface').text)
housing.text = a.find('descriptif').text.strip()
housing.location = a.find('ville').text
try:
@@ -69,10 +70,10 @@ class HousingPage(BasePage):
housing.title = details.find('titre').text
housing.text = details.find('descriptif').text.strip()
- housing.cost = float(details.find('prix').text)
+ housing.cost = Decimal(details.find('prix').text)
housing.currency = u'€'
housing.date = parse_date(details.find('dtfraicheur').text)
- housing.area = float(details.find('surface').text)
+ housing.area = Decimal(details.find('surface').text)
housing.phone = details.find('contact').find('telephone').text
try:
diff --git a/modules/societegenerale/pages/accounts_list.py b/modules/societegenerale/pages/accounts_list.py
index 91eba3ca..0ee17d07 100644
--- a/modules/societegenerale/pages/accounts_list.py
+++ b/modules/societegenerale/pages/accounts_list.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
from weboob.capabilities.bank import Account
@@ -52,9 +53,9 @@ class AccountsList(BasePage):
balance = td.find('div').text
if balance != None:
balance = balance.replace(u'\xa0','').replace(',','.')
- account.balance = float(balance)
+ account.balance = Decimal(balance)
else:
- account.balance = 0.0
+ account.balance = Decimal(0.0)
l.append(account)
diff --git a/weboob/applications/boobank/boobank.py b/weboob/applications/boobank/boobank.py
index ef0786a4..fe88476f 100644
--- a/weboob/applications/boobank/boobank.py
+++ b/weboob/applications/boobank/boobank.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import sys
from weboob.capabilities.bank import ICapBank, Account, Transaction
@@ -123,8 +124,8 @@ class AccountListFormatter(IFormatter):
MANDATORY_FIELDS = ('id', 'label', 'balance', 'coming')
count = 0
- tot_balance = 0.0
- tot_coming = 0.0
+ tot_balance = Decimal(0)
+ tot_coming = Decimal(0)
def flush(self):
if self.count < 1:
@@ -134,8 +135,8 @@ class AccountListFormatter(IFormatter):
result += u'%s Total %8s %8s' % ((' ' * 15) if not self.interactive else '',
'%.2f' % self.tot_balance, '%.2f' % self.tot_coming)
self.after_format(result)
- self.tot_balance = 0.0
- self.tot_coming = 0.0
+ self.tot_balance = Decimal(0)
+ self.tot_coming = Decimal(0)
self.count = 0
def format_dict(self, item):
@@ -152,7 +153,7 @@ class AccountListFormatter(IFormatter):
result += '------------------------------------------%s+----------+----------\n' % (('-' * 15) if not self.interactive else '')
result += (u' %s%-' + (u'15' if self.interactive else '30') + u's%s %-25s %8s %8s') % \
(self.BOLD, id, self.NC,
- item['label'], '%.2f' % item['balance'], '%.2f' % (item['coming'] or 0.0))
+ item['label'], '%.2f' % item['balance'], '%.2f' % (item['coming'] or Decimal(0.0)))
self.tot_balance += item['balance']
if item['coming']:
@@ -281,7 +282,7 @@ class Boobank(ReplApplication):
id_to, backend_name_to = self.parse_id(id_to)
try:
- amount = float(amount)
+ amount = Decimal(amount)
except (TypeError, ValueError):
print >>sys.stderr, 'Error: please give a decimal amount to transfer'
return 2
diff --git a/weboob/applications/qflatboob/main_window.py b/weboob/applications/qflatboob/main_window.py
index bae93681..66e5cf75 100644
--- a/weboob/applications/qflatboob/main_window.py
+++ b/weboob/applications/qflatboob/main_window.py
@@ -20,6 +20,8 @@
from PyQt4.QtGui import QListWidgetItem, QImage, QPixmap, QLabel, QIcon, QBrush, QColor
from PyQt4.QtCore import SIGNAL, Qt
+from decimal import Decimal
+
from weboob.tools.application.qt import QtMainWindow, QtDo, HTMLDelegate
from weboob.tools.application.qt.backendcfg import BackendCfg
from weboob.capabilities.housing import ICapHousing, Query, City
@@ -35,8 +37,8 @@ class HousingListWidgetItem(QListWidgetItem):
self.read = True
def __lt__(self, other):
- return '%s%s' % (self.read, float(self.housing.cost or 0) / float(self.housing.area or 1)) < \
- '%s%s' % (other.read, float(other.housing.cost or 0) / float(other.housing.area or 1))
+ return '%s%s' % (self.read, Decimal(self.housing.cost or 0) / Decimal(self.housing.area or 1)) < \
+ '%s%s' % (other.read, Decimal(other.housing.cost or 0) / Decimal(other.housing.area or 1))
def setAttrs(self, storage):
text = u'%s
' % self.housing.title
diff --git a/weboob/capabilities/bank.py b/weboob/capabilities/bank.py
index a6681801..3db49a4a 100644
--- a/weboob/capabilities/bank.py
+++ b/weboob/capabilities/bank.py
@@ -20,7 +20,7 @@
from datetime import date, datetime
-from .base import CapBaseObject, Field, StringField, DateField, FloatField, IntField
+from .base import CapBaseObject, Field, StringField, DateField, DecimalField, IntField
from .collection import ICapCollection
@@ -66,8 +66,8 @@ class Account(Recipient):
TYPE_JOINT = 6 # Joint account
type = IntField('Type of account', default=TYPE_UNKNOWN)
- balance = FloatField('Balance on this bank account')
- coming = FloatField('Coming balance')
+ balance = DecimalField('Balance on this bank account')
+ coming = DecimalField('Coming balance')
def __repr__(self):
return u"" % (self.id, self.label)
@@ -94,7 +94,7 @@ class Transaction(CapBaseObject):
raw = StringField('Raw label of the transaction')
category = StringField('Category of transaction')
label = StringField('Pretty label')
- amount = FloatField('Amount of transaction')
+ amount = DecimalField('Amount of transaction')
def __repr__(self):
return "" % (self.date,
@@ -105,7 +105,7 @@ class Transfer(CapBaseObject):
Transfer from an account to a recipient.
"""
- amount = FloatField('Amount to transfer')
+ amount = DecimalField('Amount to transfer')
date = Field('Date of transfer', basestring, date, datetime)
origin = Field('Origin of transfer', int, long, basestring)
recipient = Field('Recipient', int, long, basestring)
@@ -193,7 +193,7 @@ class ICapBank(ICapCollection):
:param recipient: account to send money
:type recipient: :class:`Recipient`
:param amount: amount
- :type amount: :class:`float`
+ :type amount: :class:`decimal.Decimal`
:param reason: reason of transfer
:type reason: :class:`unicode`
:rtype: :class:`Transfer`
diff --git a/weboob/capabilities/base.py b/weboob/capabilities/base.py
index 869642fe..ae42f161 100644
--- a/weboob/capabilities/base.py
+++ b/weboob/capabilities/base.py
@@ -20,6 +20,7 @@
import warnings
import datetime
+from decimal import Decimal
from copy import deepcopy
from weboob.tools.misc import to_unicode
@@ -27,8 +28,8 @@ from weboob.tools.ordereddict import OrderedDict
__all__ = ['FieldNotFound', 'NotAvailable', 'NotLoaded', 'IBaseCap',
- 'Field', 'IntField', 'FloatField', 'StringField', 'BytesField',
- 'DateField', 'DeltaField', 'CapBaseObject', 'empty']
+ 'Field', 'IntField', 'DecimalField', 'FloatField', 'StringField',
+ 'BytesField', 'DateField', 'DeltaField', 'CapBaseObject', 'empty']
def empty(value):
@@ -154,6 +155,18 @@ class IntField(Field):
def convert(self, value):
return int(value)
+class DecimalField(Field):
+ """
+ A field which accepts only :class:`decimal` type.
+ """
+ def __init__(self, doc, **kwargs):
+ Field.__init__(self, doc, Decimal, **kwargs)
+
+ def convert(self, value):
+ if isinstance(value, Decimal):
+ return value
+ return Decimal(value)
+
class FloatField(Field):
"""
A field which accepts only :class:`float` type.
@@ -244,7 +257,7 @@ class CapBaseObject(object):
class Transfer(CapBaseObject):
" Transfer from an account to a recipient. "
- amount = FloatField('Amount to transfer')
+ amount = DecimalField('Amount to transfer')
date = Field('Date of transfer', basestring, date, datetime)
origin = Field('Origin of transfer', int, long, basestring)
recipient = Field('Recipient', int, long, basestring)
diff --git a/weboob/capabilities/bill.py b/weboob/capabilities/bill.py
index ae1044a7..16bd0052 100644
--- a/weboob/capabilities/bill.py
+++ b/weboob/capabilities/bill.py
@@ -17,7 +17,7 @@
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see .
-from .base import CapBaseObject, StringField, DateField, FloatField
+from .base import CapBaseObject, StringField, DateField, DecimalField
from .collection import ICapCollection
@@ -47,7 +47,7 @@ class Detail(CapBaseObject):
label = StringField('label of the detail line')
infos = StringField('information')
datetime = DateField('date information')
- price = FloatField('price')
+ price = DecimalField('price')
def __init__(self):
CapBaseObject.__init__(self, 0)
diff --git a/weboob/capabilities/housing.py b/weboob/capabilities/housing.py
index 306f8fe9..11c1fd11 100644
--- a/weboob/capabilities/housing.py
+++ b/weboob/capabilities/housing.py
@@ -18,7 +18,7 @@
# along with weboob. If not, see .
-from .base import IBaseCap, CapBaseObject, Field, IntField, FloatField, \
+from .base import IBaseCap, CapBaseObject, Field, IntField, DecimalField, \
StringField, BytesField, DateField
@@ -50,8 +50,8 @@ class Housing(CapBaseObject):
Content of a housing.
"""
title = StringField('Title of housing')
- area = FloatField('Area of housing, in m2')
- cost = FloatField('Cost of housing')
+ area = DecimalField('Area of housing, in m2')
+ cost = DecimalField('Cost of housing')
currency = StringField('Currency of cost')
date = DateField('Date when the housing has been published')
location = StringField('Location of housing')
diff --git a/weboob/capabilities/pricecomparison.py b/weboob/capabilities/pricecomparison.py
index c8f4f2e6..aa1625a9 100644
--- a/weboob/capabilities/pricecomparison.py
+++ b/weboob/capabilities/pricecomparison.py
@@ -18,7 +18,7 @@
# along with weboob. If not, see .
-from .base import IBaseCap, CapBaseObject, Field, FloatField, \
+from .base import IBaseCap, CapBaseObject, Field, DecimalField, \
StringField, DateField
@@ -44,7 +44,7 @@ class Price(CapBaseObject):
Price.
"""
date = DateField('Date when this price has been published')
- cost = FloatField('Cost of the product in this shop')
+ cost = DecimalField('Cost of the product in this shop')
currency = StringField('Currency of the price')
message = StringField('Message related to this price')
shop = Field('Shop information', Shop)
diff --git a/weboob/tools/capabilities/bank/transactions.py b/weboob/tools/capabilities/bank/transactions.py
index 22d72cb0..aa83ec06 100644
--- a/weboob/tools/capabilities/bank/transactions.py
+++ b/weboob/tools/capabilities/bank/transactions.py
@@ -18,6 +18,7 @@
# along with weboob. If not, see .
+from decimal import Decimal
import re
import datetime
@@ -53,9 +54,9 @@ class FrenchTransaction(Transaction):
debit = self.clean_amount(debit)
if len(debit) > 0:
- self.amount = - float(debit)
+ self.amount = - Decimal(debit)
else:
- self.amount = float(credit)
+ self.amount = Decimal(credit)
def parse(self, date, raw):
"""
diff --git a/weboob/tools/config/iniconfig.py b/weboob/tools/config/iniconfig.py
index 960258a8..2742e66c 100644
--- a/weboob/tools/config/iniconfig.py
+++ b/weboob/tools/config/iniconfig.py
@@ -21,6 +21,7 @@
from __future__ import with_statement
from ConfigParser import RawConfigParser, DEFAULTSECT
+from decimal import Decimal
import logging
import os
@@ -70,7 +71,7 @@ class INIConfig(IConfig):
def save(self):
def save_section(values, root_section=self.ROOTSECT):
for k, v in values.iteritems():
- if isinstance(v, (int, float, basestring)):
+ if isinstance(v, (int, Decimal, float, basestring)):
if not self.config.has_section(root_section):
self.config.add_section(root_section)
self.config.set(root_section, k, unicode(v))