From 97066c46f05ddc464aa0d2e897cacc6e06279bc5 Mon Sep 17 00:00:00 2001 From: John Wiegley Date: Wed, 7 Sep 2005 15:01:20 +0000 Subject: [PATCH] (dataHandler): Expand commodity precision based on whatever values are seen for that commodity (although this may expand things too much, will have to wait for real world data tests to be sure). --- gnucash.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/gnucash.cc b/gnucash.cc index 31cc266a..38b31227 100644 --- a/gnucash.cc +++ b/gnucash.cc @@ -147,7 +147,8 @@ static void endElement(void *userData, const char *name) } -static amount_t convert_number(const std::string& number) +static amount_t convert_number(const std::string& number, + int * precision = NULL) { const char * num = number.c_str(); @@ -158,6 +159,9 @@ static amount_t convert_number(const std::string& number) amount_t amt(numer_str); amount_t den(denom_str); + if (precision) + *precision = denom_str.length() - 1; + if (! den) { have_error = "Denominator in entry is zero!"; return amt; @@ -238,11 +242,16 @@ static void dataHandler(void *userData, const char *s, int len) curr_entry->state = entry_t::CLEARED; break; - case XACT_VALUE: + case XACT_VALUE: { + int precision; assert(entry_comm); - curr_value = convert_number(std::string(s, len)); + curr_value = convert_number(std::string(s, len), &precision); curr_value.set_commodity(*entry_comm); + + if (precision > entry_comm->precision) + entry_comm->precision = precision; break; + } case XACT_QUANTITY: curr_quant = convert_number(std::string(s, len));