From 18c9a1af10c0f8d3df4457db90c503a681ae037b Mon Sep 17 00:00:00 2001 From: SomberNight Date: Wed, 21 Jul 2021 18:35:06 +0200 Subject: [PATCH] kivy: format_amount: minor clean-up --- electrum/gui/kivy/main_window.py | 20 ++++++++++---------- electrum/gui/kivy/uix/screens.py | 6 +----- electrum/util.py | 7 ++++++- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/electrum/gui/kivy/main_window.py b/electrum/gui/kivy/main_window.py index 026f8717e..e078603fc 100644 --- a/electrum/gui/kivy/main_window.py +++ b/electrum/gui/kivy/main_window.py @@ -24,6 +24,7 @@ from electrum import blockchain from electrum.network import Network, TxBroadcastError, BestEffortRequestFailed from electrum.interface import PREFERRED_NETWORK_PROTOCOL, ServerAddr from electrum.logging import Logger +from electrum.bitcoin import COIN from electrum.gui import messages from .i18n import _ @@ -318,7 +319,7 @@ class ElectrumWindow(App, Logger): rate = self.fx.exchange_rate() if rate.is_nan(): return '' - fiat_amount = self.get_amount(amount_str + ' ' + self.base_unit) * rate / pow(10, 8) + fiat_amount = self.get_amount(amount_str + ' ' + self.base_unit) * rate / COIN return "{:.2f}".format(fiat_amount).rstrip('0').rstrip('.') def fiat_to_btc(self, fiat_amount): @@ -327,10 +328,12 @@ class ElectrumWindow(App, Logger): rate = self.fx.exchange_rate() if rate.is_nan(): return '' - satoshis = int(pow(10,8) * Decimal(fiat_amount) / Decimal(rate)) + satoshis = COIN * Decimal(fiat_amount) / Decimal(rate) return format_satoshis_plain(satoshis, decimal_point=self.decimal_point()) - def get_amount(self, amount_str): + def get_amount(self, amount_str: str) -> Optional[int]: + if not amount_str: + return None a, u = amount_str.split() assert u == self.base_unit try: @@ -958,19 +961,16 @@ class ElectrumWindow(App, Logger): return format_satoshis_plain(amount_after_all_fees, decimal_point=self.decimal_point()) def format_amount(self, x, is_diff=False, whitespaces=False): - return format_satoshis( - x, - num_zeros=0, - decimal_point=self.decimal_point(), - is_diff=is_diff, - whitespaces=whitespaces, - ) + return self.electrum_config.format_amount(x, is_diff=is_diff, whitespaces=whitespaces) def format_amount_and_units(self, x) -> str: if x is None: return 'none' if x == '!': return 'max' + # FIXME this is using format_satoshis_plain instead of config.format_amount + # as we sometimes convert the returned string back to numbers, + # via self.get_amount()... the need for converting back should be removed return format_satoshis_plain(x, decimal_point=self.decimal_point()) + ' ' + self.base_unit def format_fee_rate(self, fee_rate): diff --git a/electrum/gui/kivy/uix/screens.py b/electrum/gui/kivy/uix/screens.py index 7deb3db63..b9f37f58f 100644 --- a/electrum/gui/kivy/uix/screens.py +++ b/electrum/gui/kivy/uix/screens.py @@ -418,11 +418,7 @@ class ReceiveScreen(CScreen): def get_URI(self): from electrum.util import create_bip21_uri - amount = self.amount - if amount: - a, u = self.amount.split() - assert u == self.app.base_unit - amount = Decimal(a) * pow(10, self.app.decimal_point()) + amount = self.app.get_amount(self.amount) return create_bip21_uri(self.address, amount, self.message) def do_copy(self): diff --git a/electrum/util.py b/electrum/util.py index e73083bf0..37847164c 100644 --- a/electrum/util.py +++ b/electrum/util.py @@ -627,11 +627,16 @@ def chunks(items, size: int): yield items[i: i + size] -def format_satoshis_plain(x, *, decimal_point=8) -> str: +def format_satoshis_plain( + x: Union[int, float, Decimal, str], # amount in satoshis, + *, + decimal_point: int = 8, # how much to shift decimal point to left (default: sat->BTC) +) -> str: """Display a satoshi amount scaled. Always uses a '.' as a decimal point and has no thousands separator""" if x == '!': return 'max' + assert isinstance(x, (int, float, Decimal)), f"{x!r} should be a number" scale_factor = pow(10, decimal_point) return "{:.8f}".format(Decimal(x) / scale_factor).rstrip('0').rstrip('.')