3 // This file is part of Moodle - http://moodle.org/
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.
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.
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/>.
21 * @copyright Petr Skoda (skodak)
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 defined('MOODLE_INTERNAL') ||
die();
27 /** @see evalmath/evalmath.class.php */
28 require_once $CFG->dirroot
.'/lib/evalmath/evalmath.class.php';
31 * This class abstracts evaluation of spreadsheet formulas.
32 * See unit tests in lib/tests/mathslib_test.php for sample usage.
35 * @copyright Petr Skoda (skodak)
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42 var $_nfx = false; // postfix notation
43 var $_error = false; // last error
46 * Constructor for spreadsheet formula with optional parameters
48 * @param string $formula with leading =
49 * @param array $params associative array of parameters used in formula. All parameter names must be lowercase!
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 '='";
58 $formula = substr($formula, 1);
60 $this->_nfx
= $this->_em
->nfx($formula);
61 if ($this->_nfx
== false) {
62 $this->_error
= $this->_em
->last_error
;
65 if ($params != false) {
66 $this->set_params($params);
71 * Old syntax of class constructor. Deprecated in PHP7.
73 * @deprecated since Moodle 3.1
75 public function calc_formula($formula, $params=false) {
76 debugging('Use of class name as constructor is deprecated', DEBUG_DEVELOPER
);
77 self
::__construct($formula, $params);
81 * Raplace parameters used in existing formula,
82 * parameter names must contain only lowercase [a-z] letters, no other characters are allowed!
84 * @param array $params associative array of parameters used in formula
86 function set_params($params) {
87 $this->_em
->v
= $params;
93 * @return mixed number if ok, false if error
96 if ($this->_nfx
== false) {
99 $res = $this->_em
->pfx($this->_nfx
);
100 if ($res === false) {
101 $this->_error
= $this->_em
->last_error
;
104 $this->_error
= false;
111 * TODO: localize the strings from contructor and EvalMath library
113 * @return mixed string with last error description or false if ok
115 function get_error() {
116 return $this->_error
;
120 * Similar to format_float, formats the numbers and list separators
121 * according to locale specifics.
122 * @param string $formula
123 * @return string localised formula
125 public static function localize($formula) {
126 $formula = str_replace('.', '$', $formula ??
''); // Temp placeholder.
127 $formula = str_replace(',', get_string('listsep', 'langconfig'), $formula);
128 $formula = str_replace('$', get_string('decsep', 'langconfig'), $formula);
133 * Similar to unformat_float, converts floats and lists to PHP standards.
134 * @param string $formula localised formula
137 public static function unlocalize($formula) {
138 $formula = str_replace(get_string('decsep', 'langconfig'), '$', $formula);
139 $formula = str_replace(get_string('listsep', 'langconfig'), ',', $formula);
140 $formula = str_replace('$', '.', $formula); // temp placeholder