diff options
-rw-r--r-- | src/amount.cc | 28 | ||||
-rw-r--r-- | src/amount.h | 5 | ||||
-rw-r--r-- | test/regress/25A099C9.test | 12 |
3 files changed, 28 insertions, 17 deletions
diff --git a/src/amount.cc b/src/amount.cc index 3bc6c871..bcd4bb8c 100644 --- a/src/amount.cc +++ b/src/amount.cc @@ -468,7 +468,7 @@ amount_t& amount_t::operator-=(const amount_t& amt) return *this; } -amount_t& amount_t::operator*=(const amount_t& amt) +amount_t& amount_t::multiply(const amount_t& amt, bool ignore_commodity) { VERIFY(amt.valid()); @@ -487,7 +487,7 @@ amount_t& amount_t::operator*=(const amount_t& amt) quantity->prec = static_cast<precision_t>(quantity->prec + amt.quantity->prec); - if (! has_commodity()) + if (! has_commodity() && ! ignore_commodity) commodity_ = amt.commodity_; if (has_commodity() && ! keep_precision()) { @@ -742,19 +742,27 @@ amount_t::value(const bool primary_only, } else if (has_annotation() && annotation().price && annotation().has_flags(ANNOTATION_PRICE_FIXATED)) { - return (*annotation().price * number()).rounded(); + amount_t price(*annotation().price); + price.multiply(*this, true); + price.in_place_round(); + return price; } else { optional<price_point_t> point = commodity().find_price(in_terms_of, moment); - // Whether a price was found or not, check whether we should attempt - // to download a price from the Internet. This is done if (a) no - // price was found, or (b) the price is "stale" according to the - // setting of --price-exp. - point = commodity().check_for_updated_price(point, moment, in_terms_of); - if (point) - return (point->price * number()).rounded(); + // Whether a price was found or not, check whether we should + // attempt to download a price from the Internet. This is done + // if (a) no price was found, or (b) the price is "stale" + // according to the setting of --price-exp. + point = commodity().check_for_updated_price(point, moment, + in_terms_of); + if (point) { + amount_t price(point->price); + price.multiply(*this, true); + price.in_place_round(); + return price; + } } } } else { diff --git a/src/amount.h b/src/amount.h index ae0e5a69..1ac4b37e 100644 --- a/src/amount.h +++ b/src/amount.h @@ -275,7 +275,10 @@ public: amount_t& operator+=(const amount_t& amt); amount_t& operator-=(const amount_t& amt); - amount_t& operator*=(const amount_t& amt); + amount_t& operator*=(const amount_t& amt) { + return multiply(amt); + } + amount_t& multiply(const amount_t& amt, bool ignore_commodity = false); /** Divide two amounts while extending the precision to preserve the accuracy of the result. For example, if \c 10 is divided by \c 3, diff --git a/test/regress/25A099C9.test b/test/regress/25A099C9.test index a74b0601..604939d8 100644 --- a/test/regress/25A099C9.test +++ b/test/regress/25A099C9.test @@ -4,16 +4,16 @@ >>>2 While parsing file "$sourcepath/src/amount.h", line 67: Error: No quantity specified for amount -While parsing file "$sourcepath/src/amount.h", line 718: +While parsing file "$sourcepath/src/amount.h", line 721: Error: Invalid date/time: line amount_t amoun -While parsing file "$sourcepath/src/amount.h", line 724: +While parsing file "$sourcepath/src/amount.h", line 727: Error: Invalid date/time: line string amount_ -While parsing file "$sourcepath/src/amount.h", line 730: +While parsing file "$sourcepath/src/amount.h", line 733: Error: Invalid date/time: line string amount_ -While parsing file "$sourcepath/src/amount.h", line 736: +While parsing file "$sourcepath/src/amount.h", line 739: Error: Invalid date/time: line string amount_ -While parsing file "$sourcepath/src/amount.h", line 742: +While parsing file "$sourcepath/src/amount.h", line 745: Error: Invalid date/time: line std::ostream& -While parsing file "$sourcepath/src/amount.h", line 749: +While parsing file "$sourcepath/src/amount.h", line 752: Error: Invalid date/time: line std::istream& === 7 |