summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2005-09-07 15:01:20 +0000
committerJohn Wiegley <johnw@newartisans.com>2008-04-13 02:41:18 -0400
commit97066c46f05ddc464aa0d2e897cacc6e06279bc5 (patch)
tree32058fb32d426c6cb5f8fd58f5db0cc3b58553b8
parentf9cd17bd310eb5166c14acc13d687abb79c81b86 (diff)
downloadledger-97066c46f05ddc464aa0d2e897cacc6e06279bc5.tar.gz
ledger-97066c46f05ddc464aa0d2e897cacc6e06279bc5.tar.bz2
ledger-97066c46f05ddc464aa0d2e897cacc6e06279bc5.zip
(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).
-rw-r--r--gnucash.cc15
1 files 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));