PHP rekenmachine
Klein snel-geschreven scriptje dat sommetjes kan uitrekenen, als concurrentie van: http://www.phphulp.nl/php/scripts/2/1726/, welke geen sommen met haakjes kan KON uitrekenen. (is al gefixt zie ik) Wat kan het: -Optellen, Aftrekken, Vermenigvuldigen en Delen. -Macht-berekenen. "2^4" wordt "8". (float of int) -Vergelijkingen: "2^4=4^2" wordt "true" (boolean) -Rekenen met getallen binnen het signed 32bit bereik (-2147483648 tot 2147483647), maar werkt in sommige gevallen (afhankelijk van het systeem en het getal) buiten dat bereik. Wat kan het niet: -een beveiligingsrisico vormen voor je website -omgaan met exponentie-getallen, zoals 4e+2. (!) -wortels trekken (in princiepe zou ik het zo kunnen toevoegen als ik weet welke operator ik daarvoor moet gebruiken) Voorbeeld van gebruik:
<?php
class calc {
const numregex = '[0-9]*\\.?[0-9]+';
const grpregex = '\\([^()]*\\)';
public function format($input) {
return preg_replace('/[^\\/\\-0-9.+*()^=]+/','',$input);
}
public function evaluate($input, $format = true) {
if($format) {
$input = $this->format($input);
}
//Remove double positive/negative identifiers.
do{$input=str_replace(array('+-','-+'),'-',$input,$count);}while($count);
do{$input=str_replace(array('++','--'),'+',$input,$count);}while($count);
//Evaluate input between '(' and ')' operators
while(preg_match('/'.self::grpregex.'/',$input,$match,PREG_OFFSET_CAPTURE)) {
$input =
substr($input,0,$match[0][1])
.$this->evaluate(substr($match[0][0],1,-1),false)
.substr($input,$match[0][1]+strlen($match[0][0]));
}
//Calculate the Y'th power of X
while(preg_match('/('.self::numregex.')\\^([+-]?'.self::numregex.')/',$input,$match,PREG_OFFSET_CAPTURE)) {
$y = pow(floatval($match[1][0]),floatval($match[2][0]));
$input = substr($input,0,$match[0][1]).$y.substr($input,$match[0][1]+strlen($match[0][0]));
}
//Multiply and Divisions
while(preg_match('/('.self::numregex.')([\\*\\/])([+-]?'.self::numregex.')/',$input,$match,PREG_OFFSET_CAPTURE)) {
if($match[2][0]=='*') {
$y = floatval($match[1][0])*floatval($match[3][0]);
} elseif($match[2][0]=='/') {
$y = floatval($match[1][0])/floatval($match[3][0]);
}
$input = substr($input,0,$match[0][1]).$y.substr($input,$match[0][1]+strlen($match[0][0]));
}
//Add and Substract
while(preg_match('/('.self::numregex.')([+-])([+-]?'.self::numregex.')/',$input,$match,PREG_OFFSET_CAPTURE)) {
if($match[2][0]=='+') {
$y = floatval($match[1][0])+floatval($match[3][0]);
} elseif($match[2][0]=='-') {
$y = floatval($match[1][0])-floatval($match[3][0]);
}
$input = substr($input,0,$match[0][1]).$y.substr($input,$match[0][1]+strlen($match[0][0]));
}
if(preg_match('/([+-]?'.self::numregex.')=([+-]?'.self::numregex.')/',$input,$match)) {
$input = (floatval($match[1][0])==floatval($match[2][0]));
} else {
$input = floatval($input);
}
return $input;
}
public static function ulate($input) {
return calc::ulator()->evaluate($input);
}
public static function ulator() {
if(!isset($GLOBALS['_calc'])) {
$GLOBALS['_calc'] = new self;
}
return $GLOBALS['_calc'];
}
}
?>
Reacties
0