Formula engine: fix abs() and modulus not working on decimals

This commit is contained in:
Celtic Minstrel 2016-03-07 03:35:52 -05:00
parent fe05f51c9e
commit c1ca72f1dc
2 changed files with 24 additions and 8 deletions

View File

@ -165,8 +165,14 @@ public:
private:
variant execute(const formula_callable& variables, formula_debugger *fdb) const {
const int n = args()[0]->evaluate(variables,fdb).as_int();
return variant(n >= 0 ? n : -n);
const variant input = args()[0]->evaluate(variables,fdb);
if(input.is_decimal()) {
const int n = input.as_decimal();
return variant(n >= 0 ? n : -n, variant::DECIMAL_VARIANT);
} else {
const int n = input.as_int();
return variant(n >= 0 ? n : -n);
}
}
};

View File

@ -696,13 +696,23 @@ variant variant::operator/(const variant& v) const
variant variant::operator%(const variant& v) const
{
const int numerator = as_int();
const int denominator = v.as_int();
if(denominator == 0) {
throw type_error((formatter() << "divide by zero error").str());
}
if(type_ == TYPE_DECIMAL || v.type_ == TYPE_DECIMAL) {
const int numerator = as_decimal();
const int denominator = v.as_decimal();
if(denominator == 0) {
throw type_error((formatter() << "divide by zero error").str());
}
return variant(numerator%denominator, DECIMAL_VARIANT);
} else {
const int numerator = as_int();
const int denominator = v.as_int();
if(denominator == 0) {
throw type_error((formatter() << "divide by zero error").str());
}
return variant(numerator%denominator);
return variant(numerator%denominator);
}
}