MDL-27659 "have evalmath accept numbers expressed with scientific
authorJamie Pratt <me@jamiep.org>
Sat, 28 May 2011 13:47:34 +0000 (20:47 +0700)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Thu, 30 Jun 2011 16:49:49 +0000 (17:49 +0100)
notation"

lib/evalmath/evalmath.class.php
lib/simpletest/testmathslib.php

index 61ebf92..6705ed2 100644 (file)
@@ -212,7 +212,7 @@ class EvalMath {
         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
index 4144c22..10dffcb 100644 (file)
@@ -194,6 +194,24 @@ class mathsslib_test extends UnitTestCase {
 
     }
 
+    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);
+
+    }
+
 }