def ufoshi_to_currency(num, currency): """Converts a given number of ufoshi to another currency as a formatted string rounded down to the proper number of decimal places. :param num: The number of ufoshi. :type num: ``int`` :param currency: One of the :ref:`supported currencies`. :type currency: ``str`` :rtype: ``str`` """ return '{:f}'.format( Decimal(num / Decimal(EXCHANGE_RATES[currency]())).quantize( Decimal('0.' + '0' * CURRENCY_PRECISION[currency]), rounding=ROUND_DOWN).normalize())
def ufoshi_to_currency_cached(num, currency): """Converts a given number of ufoshi to another currency as a formatted string rounded down to the proper number of decimal places. Results are cached using a decorator for 60 seconds by default. See :ref:`cache times`. :param num: The number of ufoshi. :type num: ``int`` :param currency: One of the :ref:`supported currencies`. :type currency: ``str`` :rtype: ``str`` """ return '{:f}'.format( Decimal(num / Decimal(currency_to_ufoshi_cached(1, currency))).quantize( Decimal('0.' + '0' * CURRENCY_PRECISION[currency]), rounding=ROUND_DOWN).normalize())
def wrapper(amount, currency): now = time() cached_rate = cached_rates[currency] if not cached_rate.satoshis or now - cached_rate.last_update > DEFAULT_CACHE_TIME: cached_rate.satoshis = EXCHANGE_RATES[currency]() cached_rate.last_update = now return int(cached_rate.satoshis * Decimal(amount))
def currency_to_ufoshi(amount, currency): """Converts a given amount of currency to the equivalent number of ufoshi. The amount can be either an int, float, or string as long as it is a valid input to :py:class:`decimal.Decimal`. :param amount: The quantity of currency. :param currency: One of the :ref:`supported currencies`. :type currency: ``str`` :rtype: ``int`` """ ufoshis = EXCHANGE_RATES[currency]() return int(ufoshis * Decimal(amount))
def test_zero_places(self): assert Decimal(satoshi_to_currency(100000, 'jpy')).as_tuple().exponent == 0
def satoshi_to_ufoshi(cls): return cls.currency_to_ufoshi('btc') / Decimal(BTC)
def currency_to_ufoshi(cls, currency): r = requests.get(cls.MAIN_ENDPOINT, params={'convert': currency}) rate = r.json()[0]['price_' + currency.lower()] return int(ONE / Decimal(rate) * BTC)
from collections import OrderedDict from decimal import ROUND_DOWN from functools import wraps from time import time import requests from ufobit.utils import Decimal DEFAULT_CACHE_TIME = 60 # Constant for use in deriving exchange # rates when given in terms of 1 BTC. ONE = Decimal(1) SATOSHI = 1 BTC = 10**8 SUPPORTED_CURRENCIES = OrderedDict([ ('ufoshi', 'Ufoshi'), ('ufo', 'UFO'), ('satoshi', 'Satoshi'), ('btc', 'Bitcoin'), ('usd', 'United States Dollar'), ('rub', 'Russian Ruble'), ]) # https://en.wikipedia.org/wiki/ISO_4217 CURRENCY_PRECISION = { 'ufoshi': 0, 'ufo': 8,