@@ -9,21 +9,24 @@ from .. import rate as oxrrate
try:
import enum
except ImportError:
import enum34 as enum
class Formatter:
def __init__(self, rate, signed_currencies=(), base_fmt='#,##0.###'):
def __init__(self, rate, signed_currencies=(), base_fmt='#,##0.###',
rate_precision=5, denomination=None):
self.rate = rate
self.base_fmt = base_fmt
self.base_fmt_noprec = base_fmt.rsplit('.', 1)[0]
self.signed_currencies = set(code for code in signed_currencies
if self.can_sign_currency(code))
self.rate_prec = rate_precision
self.denomination = denomination
def can_sign_currency(self, code):
return len(babel.numbers.get_currency_symbol(code)) == 1
return False
def format_currency(self, amount, code, currency_digits=True):
if currency_digits:
fmt = self.base_fmt
else:
fmt = '{}.{}'.format(self.base_fmt_noprec, '#' * -amount.as_tuple().exponent)
@@ -34,12 +37,15 @@ class Formatter:
return babel.numbers.format_currency(amount, code, fmt, currency_digits=currency_digits)
def currency_decimal(self, amount, currency):
amt_s = babel.numbers.format_currency(amount, currency, '###0.###')
return decimal.Decimal(amt_s)
def normalize_rate(self, rate, prec=None):
return rate
def format_rate(self, rate):
return "{:g}".format(rate)
def format_rate_pair(self, from_curr, to_curr):
from_amt = 1
to_amt = self.rate.convert(from_amt, from_curr, to_curr)
@@ -61,17 +67,14 @@ class Formatter:
self.format_currency(from_amt, from_curr),
self.format_currency(to_amt, to_curr),
)
class LedgerFormatter(Formatter):
super().__init__(rate, signed_currencies, base_fmt)
if prec is None:
prec = self.rate_prec
_, digits, exponent = rate.normalize().as_tuple()
# Return ``prec`` nonzero digits of precision, if available.
@@ -147,17 +150,17 @@ class Formats(enum.Enum):
def run(config, stdout, stderr):
loaders = config.get_loaders()
with loaders.historical(config.args.date, config.args.base) as rate_json:
rate = oxrrate.Rate.from_json_file(rate_json)
if loaders.should_cache():
config.cache.save_rate(rate)
if config.args.output_format is Formats.LEDGER:
formatter = LedgerFormatter(rate, config.args.signed_currencies,
denomination=config.args.denomination)
formatter = Formatter(rate)
formatter = config.args.output_format.value(
rate,
config.args.signed_currencies,
denomination=config.args.denomination,
if not config.args.from_currency:
for from_curr in sorted(rate.rates):
print(formatter.format_rate_pair_bidir(from_curr, config.args.to_currency),
file=stdout)
elif config.args.amount is None:
print(formatter.format_rate_pair_bidir(config.args.from_currency, config.args.to_currency),