optimized printing of amounts

This commit is contained in:
John Wiegley 2004-08-14 00:29:52 -04:00
parent c6b82f8359
commit 42298cefd5
3 changed files with 27 additions and 43 deletions

View file

@ -503,33 +503,38 @@ std::ostream& operator<<(std::ostream& out, const amount_t& amt)
out << quotient; out << quotient;
} }
else { else {
bool printed = false; strings_list strs;
char buf[4];
mpz_t temp; mpz_t temp;
mpz_init(temp); mpz_init(temp);
// jww (2003-09-29): use a smarter starting value for `powers' for (int powers = 0; true; powers += 3) {
for (int powers = 15; powers >= 0; powers -= 3) { if (powers > 0) {
mpz_ui_pow_ui(divisor, 10, powers); mpz_ui_pow_ui(divisor, 10, powers);
mpz_tdiv_q(temp, quotient, divisor); mpz_tdiv_q(temp, quotient, divisor);
if (mpz_sgn(temp) == 0) if (mpz_sgn(temp) == 0)
continue; break;
mpz_tdiv_r_ui(temp, temp, 1000);
} else {
mpz_tdiv_r_ui(temp, quotient, 1000);
}
mpz_get_str(buf, 10, temp);
strs.push_back(buf);
}
mpz_ui_pow_ui(divisor, 10, 3); bool printed = false;
mpz_tdiv_r(temp, temp, divisor);
for (strings_list::iterator i = strs.begin(); i != strs.end(); i++) {
if (printed) { if (printed) {
out << (amt.commodity->flags & COMMODITY_STYLE_EUROPEAN ? '.' : ',');
out.width(3); out.width(3);
out.fill('0'); out.fill('0');
} }
out << temp; out << *i;
if (powers > 0) {
out << ((amt.commodity->flags & COMMODITY_STYLE_EUROPEAN) ? '.' : ',');
printed = true; printed = true;
} }
}
mpz_clear(temp); mpz_clear(temp);
} }

View file

@ -18,20 +18,6 @@ amount_t balance_t::amount(const commodity_t * commodity) const
return amount_t(); return amount_t();
} }
#if 0
balance_t balance_t::round() const
{
balance_t temp;
for (amounts_map::const_iterator i = amounts.begin();
i != amounts.end();
i++)
temp += (*i).second.round();
return temp;
}
#endif
balance_t balance_t::value(const std::time_t moment) const balance_t balance_t::value(const std::time_t moment) const
{ {
balance_t temp; balance_t temp;
@ -41,11 +27,7 @@ balance_t balance_t::value(const std::time_t moment) const
i++) i++)
temp += (*i).second.value(moment); temp += (*i).second.value(moment);
#if 1
return temp; return temp;
#else
return temp.round();
#endif
} }
void balance_t::write(std::ostream& out, void balance_t::write(std::ostream& out,

View file

@ -333,9 +333,6 @@ class balance_t
} }
amount_t amount(const commodity_t * commodity = NULL) const; amount_t amount(const commodity_t * commodity = NULL) const;
#if 0
balance_t round() const;
#endif
balance_t value(const std::time_t moment) const; balance_t value(const std::time_t moment) const;
void write(std::ostream& out, void write(std::ostream& out,