[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/ -> mathslib.php (source)

   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * @package    core
  20   * @subpackage lib
  21   * @copyright  Petr Skoda (skodak)
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  defined('MOODLE_INTERNAL') || die();
  26  
  27  /** @see evalmath/evalmath.class.php */
  28  require_once $CFG->dirroot.'/lib/evalmath/evalmath.class.php';
  29  
  30  /**
  31   * This class abstracts evaluation of spreadsheet formulas.
  32   * See unit tests in lib/tests/mathslib_test.php for sample usage.
  33   *
  34   * @package moodlecore
  35   * @copyright Petr Skoda (skodak)
  36    * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  37   */
  38  class calc_formula {
  39  
  40      // private properties
  41      var $_em;
  42      var $_nfx   = false;   // postfix notation
  43      var $_error = false; // last error
  44  
  45      /**
  46       * Constructor for spreadsheet formula with optional parameters
  47       *
  48       * @param string $formula with leading =
  49       * @param array $params associative array of parameters used in formula. All parameter names must be lowercase!
  50       */
  51      public function __construct($formula, $params=false) {
  52          $this->_em = new EvalMath();
  53          $this->_em->suppress_errors = true; // no PHP errors!
  54          if (strpos($formula, '=') !== 0) {
  55              $this->_error = "missing leading '='";
  56              return;
  57          }
  58          $formula = substr($formula, 1);
  59          if (strpos($formula, '=') !== false) {
  60              $this->_error = "too many '='";
  61              return;
  62          }
  63          $this->_nfx = $this->_em->nfx($formula);
  64          if ($this->_nfx == false) {
  65              $this->_error = $this->_em->last_error;
  66              return;
  67          }
  68          if ($params != false) {
  69              $this->set_params($params);
  70          }
  71      }
  72  
  73      /**
  74       * Old syntax of class constructor. Deprecated in PHP7.
  75       *
  76       * @deprecated since Moodle 3.1
  77       */
  78      public function calc_formula($formula, $params=false) {
  79          debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER);
  80          self::__construct($formula, $params);
  81      }
  82  
  83      /**
  84       * Raplace parameters used in existing formula,
  85       * parameter names must contain only lowercase [a-z] letters, no other characters are allowed!
  86       *
  87       * @param array $params associative array of parameters used in formula
  88       */
  89      function set_params($params) {
  90          $this->_em->v = $params;
  91      }
  92  
  93      /**
  94       * Evaluate formula
  95       *
  96       * @return mixed number if ok, false if error
  97       */
  98      function evaluate() {
  99          if ($this->_nfx == false) {
 100              return false;
 101          }
 102          $res = $this->_em->pfx($this->_nfx);
 103          if ($res === false) {
 104              $this->_error = $this->_em->last_error;
 105              return false;
 106          } else {
 107              $this->_error = false;
 108              return $res;
 109          }
 110      }
 111  
 112      /**
 113       * Get last error.
 114       * TODO: localize the strings from contructor and EvalMath library
 115       *
 116       * @return mixed string with last error description or false if ok
 117       */
 118      function get_error() {
 119          return $this->_error;
 120      }
 121  
 122      /**
 123       * Similar to format_float, formats the numbers and list separators
 124       * according to locale specifics.
 125       * @param string $formula
 126       * @return string localised formula
 127       */
 128      public static function localize($formula) {
 129          $formula = str_replace('.', '$', $formula); // temp placeholder
 130          $formula = str_replace(',', get_string('listsep', 'langconfig'), $formula);
 131          $formula = str_replace('$', get_string('decsep', 'langconfig'), $formula);
 132          return $formula;
 133      }
 134  
 135      /**
 136       * Similar to unformat_float, converts floats and lists to PHP standards.
 137       * @param string $formula localised formula
 138       * @return string
 139       */
 140      public static function unlocalize($formula) {
 141          $formula = str_replace(get_string('decsep', 'langconfig'), '$', $formula);
 142          $formula = str_replace(get_string('listsep', 'langconfig'), ',', $formula);
 143          $formula = str_replace('$', '.', $formula); // temp placeholder
 144          return $formula;
 145      }
 146  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1