Permalink
Browse files

MDL-27659 "have evalmath accept numbers expressed with scientific

notation"
  • Loading branch information...
1 parent 4733133 commit 9085134ed7230734bdccd1d3ff9bd11cf5d9e6da @jamiepratt jamiepratt committed with timhunt May 28, 2011
Showing with 19 additions and 1 deletion.
  1. +1 −1 lib/evalmath/evalmath.class.php
  2. +18 −0 lib/simpletest/testmathslib.php
View
2 lib/evalmath/evalmath.class.php
@@ -212,7 +212,7 @@ function nfx($expr) {
while(1) { // 1 Infinite Loop ;)
$op = substr($expr, $index, 1); // get the first character at the current index
// find out if we're currently at the beginning of a number/variable/function/parenthesis/operand
- $ex = preg_match('/^('.self::$namepat.'\(?|\d+(?:\.\d*)?|\.\d+|\()/', substr($expr, $index), $match);
+ $ex = preg_match('/^('.self::$namepat.'\(?|\d+(?:\.\d*)?(?:(e[+-]?)\d*)?|\.\d+|\()/', substr($expr, $index), $match);
//===============
if ($op == '-' and !$expecting_op) { // is it a negation instead of a minus?
$stack->push('_'); // put a negation on the stack
View
18 lib/simpletest/testmathslib.php
@@ -194,6 +194,24 @@ public function test_rounding_function() {
}
+ public function test_scientific_notation() {
+ $formula = new calc_formula('=10e10');
+ $this->assertWithinMargin($formula->evaluate(), 1e11, 1e11*1e-15);
+
+ $formula = new calc_formula('=10e-10');
+ $this->assertWithinMargin($formula->evaluate(), 1e-9, 1e11*1e-15);
+
+ $formula = new calc_formula('=10e+10');
+ $this->assertWithinMargin($formula->evaluate(), 1e11, 1e11*1e-15);
+
+ $formula = new calc_formula('=10e10*5');
+ $this->assertWithinMargin($formula->evaluate(), 5e11, 1e11*1e-15);
+
+ $formula = new calc_formula('=10e10^2');
+ $this->assertWithinMargin($formula->evaluate(), 1e22, 1e22*1e-15);
+
+ }
+
}

0 comments on commit 9085134

Please sign in to comment.