Merge branch 'MDL-26365' of git://github.com/timhunt/moodle
[moodle.git] / lib / mathslib.php
blobbc0b38d6665dec28d76a7a42bea68faed62c9649
1 <?php
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.
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/>.
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
25 defined('MOODLE_INTERNAL') || die();
27 /** @see evalmath/evalmath.class.php */
28 require_once $CFG->dirroot.'/lib/evalmath/evalmath.class.php';
30 /**
31 * This class abstracts evaluation of spreadsheet formulas.
32 * See unit tests in lib/simpletest/testmathslib.php for sample usage.
34 * @package moodlecore
35 * @copyright Petr Skoda (skodak)
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class calc_formula {
40 // private properties
41 var $_em;
42 var $_nfx = false; // postfix notation
43 var $_error = false; // last error
45 /**
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 function calc_formula($formula, $params=false) {
52 $this->_em = new EvalMath();
53 $this->_em->suppress_errors = !debugging('', DEBUG_DEVELOPER);
54 if (strpos($formula, '=') !== 0) {
55 $this->_error = "missing leading '='";
56 return;
58 $formula = substr($formula, 1);
59 if (strpos($formula, '=') !== false) {
60 $this->_error = "too many '='";
61 return;
63 $this->_nfx = $this->_em->nfx($formula);
64 if ($this->_nfx == false) {
65 $this->_error = $this->_em->last_error;
66 return;
68 if ($params != false) {
69 $this->set_params($params);
73 /**
74 * Raplace parameters used in existing formula,
75 * parameter names must contain only lowercase [a-z] letters, no other characters are allowed!
77 * @param array $params associative array of parameters used in formula
79 function set_params($params) {
80 $this->_em->v = $params;
83 /**
84 * Evaluate formula
86 * @return mixed number if ok, false if error
88 function evaluate() {
89 if ($this->_nfx == false) {
90 return false;
92 $res = $this->_em->pfx($this->_nfx);
93 if ($res === false) {
94 $this->_error = $this->_em->last_error;
95 return false;
96 } else {
97 $this->_error = false;
98 return $res;
103 * Get last error.
104 * TODO: localize the strings from contructor and EvalMath library
106 * @return mixed string with last error description or false if ok
108 function get_error() {
109 return $this->_error;
113 * Similar to format_float, formats the numbers and list separators
114 * according to locale specifics.
115 * @param string $formula
116 * @return string localised formula
118 function localize($formula) {
119 $formula = str_replace('.', '$', $formula); // temp placeholder
120 $formula = str_replace(',', get_string('listsep', 'langconfig'), $formula);
121 $formula = str_replace('$', get_string('decsep', 'langconfig'), $formula);
122 return $formula;
126 * Similar to unformat_float, converts floats and lists to PHP standards.
127 * @param string $formula localised formula
128 * @return string
130 function unlocalize($formula) {
131 $formula = str_replace(get_string('decsep', 'langconfig'), '$', $formula);
132 $formula = str_replace(get_string('listsep', 'langconfig'), ',', $formula);
133 $formula = str_replace('$', '.', $formula); // temp placeholder
134 return $formula;