From c1ca72f1dc2e1255877f89100783c198866281d9 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 7 Mar 2016 03:35:52 -0500 Subject: [PATCH] Formula engine: fix abs() and modulus not working on decimals --- src/formula_function.cpp | 10 ++++++++-- src/variant.cpp | 22 ++++++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/formula_function.cpp b/src/formula_function.cpp index 2afa12fe25ad..e110b1c1f075 100644 --- a/src/formula_function.cpp +++ b/src/formula_function.cpp @@ -165,8 +165,14 @@ class abs_function : public function_expression { 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); + } } }; diff --git a/src/variant.cpp b/src/variant.cpp index ff8bdcad6500..b60c194e633a 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -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); + } }