diff --git a/oxrlib/commands/historical.py b/oxrlib/commands/historical.py index 0b0b58f39fe892b125bd8b9d6681dfc335212239..47c141a8f8509b3a1e8a5e3bc15b376bb1f23750 100644 --- a/oxrlib/commands/historical.py +++ b/oxrlib/commands/historical.py @@ -55,14 +55,16 @@ class Formatter: class LedgerFormatter(Formatter): - RATE_PREC = 5 + def __init__(self, rate, signed_currencies=(), base_fmt='#,##0.###', + rate_precision=5, denomination=None): + super().__init__(rate, signed_currencies, base_fmt) + self.rate_prec = rate_precision + self.denomination = denomination - def normalize_rate(self, rate, prec=None): - # Return prec nonzero digits of precision, if available. - if prec is None: - prec = self.RATE_PREC + def normalize_rate(self, rate): _, digits, exponent = rate.normalize().as_tuple() - prec -= min(0, exponent + len(digits)) + # Return ``self.rate_prec`` nonzero digits of precision, if available. + prec = self.rate_prec - min(0, exponent + len(digits)) quant_to = '1.{}'.format('0' * prec) try: qrate = rate.quantize(decimal.Decimal(quant_to)) @@ -71,11 +73,11 @@ class LedgerFormatter(Formatter): qrate = rate return qrate.normalize() - def format_rate(self, rate, prec=None): - return str(self.normalize_rate(rate, prec)) + def format_rate(self, rate): + return str(self.normalize_rate(rate)) - def format_ledger_rate(self, rate, curr, prec=None): - nrate = self.normalize_rate(rate, prec) + def format_ledger_rate(self, rate, curr): + nrate = self.normalize_rate(rate) rate_s = self.format_currency(nrate, curr, currency_digits=False) return "{{={0}}} @ {0}".format(rate_s) @@ -85,13 +87,28 @@ class LedgerFormatter(Formatter): return "{} {} {}".format( from_amt, from_curr, self.format_ledger_rate(to_amt, to_curr)) + def _denomination_for(self, currency, default): + if self.denomination is None: + return default + elif self.denomination == currency: + return None + else: + return self.denomination + + def format_denominated_rate(self, amount, currency, default_denomination): + denomination = self._denomination_for(currency, default_denomination) + amt_s = self.format_currency(amount, currency) + if denomination is None: + return amt_s + else: + rate = self.rate.convert(1, currency, denomination) + return "{} {}".format(amt_s, self.format_ledger_rate(rate, denomination)) + def format_conversion(self, from_amt, from_curr, to_curr): - to_rate = self.rate.convert(1, from_curr, to_curr) to_amt = self.rate.convert(from_amt, from_curr, to_curr) - return "{} {}\n{}".format( - self.format_currency(from_amt, from_curr), - self.format_ledger_rate(to_rate, to_curr), - self.format_currency(to_amt, to_curr), + return "{}\n{}".format( + self.format_denominated_rate(from_amt, from_curr, to_curr), + self.format_denominated_rate(to_amt, to_curr, None), ) @@ -102,7 +119,8 @@ def run(config, stdout, stderr): if loaders.should_cache(): config.cache.save_rate(rate) if config.args.ledger: - formatter = LedgerFormatter(rate, config.args.signed_currencies) + formatter = LedgerFormatter(rate, config.args.signed_currencies, + denomination=config.args.denomination) else: formatter = Formatter(rate) if not config.args.from_currency: