mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-05 19:55:53 +00:00
* Retrieve and process summary or full ledgers. * Search using arbitrary criteria (any Python function). * Search using arbitrary formats (any Python function). * Caches ledgers as .gz files to avoid repeated server requests. * Handles ledger numbers, ranges, and special names like validated or closed.
47 lines
1.3 KiB
Python
47 lines
1.3 KiB
Python
from __future__ import absolute_import, division, print_function, unicode_literals
|
|
|
|
"""Fixed point numbers."""
|
|
|
|
POSITIONS = 10
|
|
POSITIONS_SHIFT = 10 ** POSITIONS
|
|
|
|
class Decimal(object):
|
|
def __init__(self, desc='0'):
|
|
if isinstance(desc, int):
|
|
self.value = desc
|
|
return
|
|
if desc.startswith('-'):
|
|
sign = -1
|
|
desc = desc[1:]
|
|
else:
|
|
sign = 1
|
|
parts = desc.split('.')
|
|
if len(parts) == 1:
|
|
parts.append('0')
|
|
elif len(parts) > 2:
|
|
raise Exception('Too many decimals in "%s"' % desc)
|
|
number, decimal = parts
|
|
# Fix the number of positions.
|
|
decimal = (decimal + POSITIONS * '0')[:POSITIONS]
|
|
self.value = sign * int(number + decimal)
|
|
|
|
def accumulate(self, item):
|
|
if not isinstance(item, Decimal):
|
|
item = Decimal(item)
|
|
self.value += item.value
|
|
|
|
def __str__(self):
|
|
if self.value >= 0:
|
|
sign = ''
|
|
value = self.value
|
|
else:
|
|
sign = '-'
|
|
value = -self.value
|
|
number = value // POSITIONS_SHIFT
|
|
decimal = (value % POSITIONS_SHIFT) * POSITIONS_SHIFT
|
|
|
|
if decimal:
|
|
return '%s%s.%s' % (sign, number, str(decimal).rstrip('0'))
|
|
else:
|
|
return '%s%s' % (sign, number)
|