diff --git a/libgnucash/app-utils/gnc-ui-util.cpp b/libgnucash/app-utils/gnc-ui-util.cpp index d19d2edb95e..468bc82649c 100644 --- a/libgnucash/app-utils/gnc-ui-util.cpp +++ b/libgnucash/app-utils/gnc-ui-util.cpp @@ -45,6 +45,8 @@ #include #include +#include + #include "qof.h" #include "gnc-prefs.h" #include "Account.h" @@ -1498,19 +1500,24 @@ gnc_wrap_text_with_bidi_ltr_isolate (const char* text) ********************************************************************/ static std::string -number_to_words(double val) +number_to_words(double val, int64_t denom) { UErrorCode status{U_ZERO_ERROR}; icu::RuleBasedNumberFormat formatter{icu::URBNF_SPELLOUT, icu::Locale{}, status}; icu::UnicodeString result; std::string words; + double int_part; if (U_FAILURE(status)) { PERR("Error creating formatter: %s", u_errorName(status)); return ""; } - formatter.format (std::fabs(val), result, status); + const int frac_part = std::round(std::modf (std::fabs(val), &int_part) * denom); + const std::vector tail = + { " ", _("and"), " ", std::to_string (frac_part), "/", std::to_string (denom) }; + + formatter.format (int_part, result, status); if (U_FAILURE(status)) { PERR("Error formatting number: %s", u_errorName(status)); @@ -1518,6 +1525,8 @@ number_to_words(double val) } result.toUTF8String(words); + + words = std::accumulate (tail.begin(), tail.end(), words); DEBUG ("Number %f in words: %s", val, words.c_str()); return words; @@ -1534,7 +1543,7 @@ static double round(double x) char* numeric_to_words(gnc_numeric val) { - return g_strdup(number_to_words (gnc_numeric_to_double(val)).c_str()); + return g_strdup(number_to_words (gnc_numeric_to_double(val), gnc_numeric_denom(val)).c_str()); } const char*