(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();
|
_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_comma = quant.rfind(',');
|
||||||
std::string::size_type last_period = 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;
|
quantity->prec = quant.length() - last_period - 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (last_comma != std::string::npos) {
|
else if (last_comma != std::string::npos &&
|
||||||
comm_flags |= COMMODITY_STYLE_EUROPEAN;
|
(! commodity_t::default_commodity ||
|
||||||
|
commodity_t::default_commodity->flags & COMMODITY_STYLE_EUROPEAN)) {
|
||||||
|
comm_flags |= COMMODITY_STYLE_EUROPEAN;
|
||||||
quantity->prec = quant.length() - last_comma - 1;
|
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;
|
quantity->prec = quant.length() - last_period - 1;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
quantity->prec = 0;
|
quantity->prec = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the commodity if has not already been seen, and update the
|
// Set the commodity's flags and precision accordingly
|
||||||
// precision if something greater was used for the quantity.
|
|
||||||
|
|
||||||
commodity_ = commodity_t::find_commodity(symbol, true);
|
if (newly_created || ! (flags & AMOUNT_PARSE_NO_MIGRATE)) {
|
||||||
if (! (flags & AMOUNT_PARSE_NO_MIGRATE)) {
|
|
||||||
commodity_->flags |= comm_flags;
|
commodity_->flags |= comm_flags;
|
||||||
if (quantity->prec > commodity_->precision)
|
if (quantity->prec > commodity_->precision)
|
||||||
commodity_->precision = quantity->prec;
|
commodity_->precision = quantity->prec;
|
||||||
|
|
@ -1143,6 +1155,13 @@ commodity_t * commodity_t::find_commodity(const std::string& symbol,
|
||||||
if (auto_create) {
|
if (auto_create) {
|
||||||
commodity_t * commodity = new commodity_t(symbol);
|
commodity_t * commodity = new commodity_t(symbol);
|
||||||
add_commodity(commodity);
|
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;
|
return commodity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue