(parse): A fix to the way commodity flags are applied to newly parsed
commodities. This was needing for an edge-case involving commodities that first appears as part of the cost (@ SPEC) of a transaction.
This commit is contained in:
parent
0ce43eebae
commit
d83008166a
1 changed files with 26 additions and 7 deletions
33
amount.cc
33
amount.cc
|
|
@ -887,6 +887,17 @@ void amount_t::parse(std::istream& in, unsigned short flags)
|
|||
|
||||
_init();
|
||||
|
||||
// Create the commodity if has not already been seen, and update the
|
||||
// precision if something greater was used for the quantity.
|
||||
|
||||
bool newly_created = (commodity_t::commodities.find(symbol) ==
|
||||
commodity_t::commodities.end());
|
||||
|
||||
commodity_ = commodity_t::find_commodity(symbol, true);
|
||||
|
||||
// Determine the precision of the amount, based on the usage of
|
||||
// comma or period.
|
||||
|
||||
std::string::size_type last_comma = quant.rfind(',');
|
||||
std::string::size_type last_period = quant.rfind('.');
|
||||
|
||||
|
|
@ -899,22 +910,23 @@ void amount_t::parse(std::istream& in, unsigned short flags)
|
|||
quantity->prec = quant.length() - last_period - 1;
|
||||
}
|
||||
}
|
||||
else if (last_comma != std::string::npos) {
|
||||
comm_flags |= COMMODITY_STYLE_EUROPEAN;
|
||||
else if (last_comma != std::string::npos &&
|
||||
(! commodity_t::default_commodity ||
|
||||
commodity_t::default_commodity->flags & COMMODITY_STYLE_EUROPEAN)) {
|
||||
comm_flags |= COMMODITY_STYLE_EUROPEAN;
|
||||
quantity->prec = quant.length() - last_comma - 1;
|
||||
}
|
||||
else if (last_period != std::string::npos) {
|
||||
else if (last_period != std::string::npos &&
|
||||
! (commodity_->flags & COMMODITY_STYLE_EUROPEAN)) {
|
||||
quantity->prec = quant.length() - last_period - 1;
|
||||
}
|
||||
else {
|
||||
quantity->prec = 0;
|
||||
}
|
||||
|
||||
// Create the commodity if has not already been seen, and update the
|
||||
// precision if something greater was used for the quantity.
|
||||
// Set the commodity's flags and precision accordingly
|
||||
|
||||
commodity_ = commodity_t::find_commodity(symbol, true);
|
||||
if (! (flags & AMOUNT_PARSE_NO_MIGRATE)) {
|
||||
if (newly_created || ! (flags & AMOUNT_PARSE_NO_MIGRATE)) {
|
||||
commodity_->flags |= comm_flags;
|
||||
if (quantity->prec > commodity_->precision)
|
||||
commodity_->precision = quantity->prec;
|
||||
|
|
@ -1143,6 +1155,13 @@ commodity_t * commodity_t::find_commodity(const std::string& symbol,
|
|||
if (auto_create) {
|
||||
commodity_t * commodity = new commodity_t(symbol);
|
||||
add_commodity(commodity);
|
||||
|
||||
// Start out the new commodity with the default commodity's flags
|
||||
// and precision, if one has been defined.
|
||||
if (default_commodity) {
|
||||
commodity->flags = default_commodity->flags;
|
||||
commodity->precision = default_commodity->precision;
|
||||
}
|
||||
return commodity;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue