From e2998acc9d644d345a3a0ccdc8cabc3d0f2edece Mon Sep 17 00:00:00 2001 From: sowle Date: Sun, 7 Jul 2024 20:34:19 +0200 Subject: [PATCH] print_fixed_decimal_point() and print_money_brief() fixed for too big decimal point values --- .../epee/include/print_fixed_point_helper.h | 2 ++ src/currency_core/currency_format_utils.cpp | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/contrib/epee/include/print_fixed_point_helper.h b/contrib/epee/include/print_fixed_point_helper.h index 91de1dd4..5a1eace8 100644 --- a/contrib/epee/include/print_fixed_point_helper.h +++ b/contrib/epee/include/print_fixed_point_helper.h @@ -36,6 +36,8 @@ namespace epee inline std::string print_fixed_decimal_point(t_number amount, size_t decimal_point) { std::string s = boost::lexical_cast(amount); + if (decimal_point > 32) + return std::string("!!") + s; // avoiding overflow issues if (s.size() < decimal_point + 1) { s.insert(0, decimal_point + 1 - s.size(), '0'); diff --git a/src/currency_core/currency_format_utils.cpp b/src/currency_core/currency_format_utils.cpp index c28a212d..afd632d7 100644 --- a/src/currency_core/currency_format_utils.cpp +++ b/src/currency_core/currency_format_utils.cpp @@ -3463,6 +3463,27 @@ namespace currency //--------------------------------------------------------------- std::string print_money_brief(uint64_t amount, size_t decimal_point /* = CURRENCY_DISPLAY_DECIMAL_POINT */) { + // TODO: temporary fix for insanely big decimal points + // TODO: remove it after setting the limit to 18 -- sowle + if (decimal_point > 32) + return std::string("!!") + std::to_string(amount); + if (decimal_point >= 20) + { + std::string r = std::to_string(amount); + if (decimal_point + 1 > r.size()) + r.insert(0, decimal_point - r.size() + 1, '0'); + r.insert(r.begin() + 1, '.'); + size_t p = r.find_last_not_of('0'); + if (p != r.npos) + { + if (r[p] != '.' && p + 1 < r.size()) + r.erase(p + 1); + else if (p + 2 < r.size()) + r.erase(p + 2); + } + return r; + } + uint64_t coin = decimal_point == CURRENCY_DISPLAY_DECIMAL_POINT ? COIN : crypto::constexpr_pow(decimal_point, 10); uint64_t remainder = amount % coin; amount /= coin;