Calculatie Parser

Door Pim -, 17 jaar geleden, 6.570x bekeken

Een berekening uitvoeren zonder eval()? Dat kan met deze parser.

Gebaseerd op de bbcode parser van Richard van Velzen, hierbij bedankt.

Documentatie

Er zijn twee versies om het script aan te roepen: een voor versie < 5.3 (index_old.php) en een voor 5.3 (index.php). De laatste maakt gebruikt van anonymous functions, wat de code netter maakt.

Mogelijkheden:
Goede error afhandeling met exceptions
Alle standaard berekeningen ( +,-,/,*,^)
Vergelijkingen met =, klopt geeft 1, fout geeft 0
Wortels
Logaritmen
Getallen met de notatie 5.2E-3 (let op: grote E)
Constanten (nu alleen e en pi)
Faculteit (5! geeft 5*4*3*2*1= 120)

En het mooiste, je kan dit alles zelf aanpassen: met een zelfgeschreven functie kan je een operatie toevoegen!!!


Je kan zelf heel makkelijk operaties toevoegen met de syntax

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$parser
->addOperator($operatorName, $operatorSymbol, $operatorHierarchy, $operatorFunction, $variablePositions);
?>

De name en symbol spreken voor zich. Die hiërarchie is van Meneer Van Dalen Wacht Op Antwoord: Hoe hoger, hoe eerder hij uitgevoerd zal worden.
De function kan als string van de functienaam die je dan eerder hebt gedeclareerd, of als anonymous function (php 5.3).

Je kan ook constanten definiëren met dezelfde syntax, gebruik alleen null voor hierarchy en OperatorRule::VAR_NONE als variablePositions.

De variabelen posities geeft aan waar de variabelen zitten, default is dit de const OperatorRule::VAR_BOTH, maar je kan ook, zoals bij een wortel, OperatorRule::VAR_AFTER of, zoals bij een faculteit, OperatorRule::VAR_BEFORE opgeven.

Dit is mijn eerste publieke (en complexe) script, alle complimenten en zeker ook kritiek is van harte welkom.

Voorbeeld: http://pimwebdesign.nl/calc/index_old.php?(e*2)log(3-6.2E-4)

Gesponsorde koppelingen

PHP script bestanden

  1. calculatie-parser

 

Er zijn 18 reacties op 'Calculatie parser'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Bart niethenk
bart niethenk
17 jaar geleden
 
0 +1 -0 -1
Ziet er heel erg netjes uit.
Alleen :
Warning: Division by zero in /customers/pimwebdesign.nl/pimwebdesign.nl/httpd.www/calc/index_old.php on line 17
6/0 = 0

voor de rest niets op aan te merken erg nette code.
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Danku en dat is snel.
Ja ik moet eigenlijk per operator exceptions aangeven... Dat pas ik wel even aan

EDIT: Aangepast, geeft nu een nette exception
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Ja, ok pas ik wel even aan.
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Opgelost, bedankt voor de feedback
Onbekend Onbekend
Onbekend Onbekend
17 jaar geleden
 
0 +1 -0 -1
Misschien ook met haken iets doen?
8^(3^4) pakt ie niet. Is toch wel zonde.
Steen
steen
17 jaar geleden
 
0 +1 -0 -1
Mooi script,,, als die kinderziektes er uit zijn teminste. Ik zou ook $_POST ipv $_GET gebruiken.
M Ypma
M Ypma
17 jaar geleden
 
0 +1 -0 -1
@steen, dat is maar hoe je het implementeert, als jij POST wilt gebruiken kan dat prima. Dit script vereist dat niet. In zijn voorbeeld gebruikt hij bijvoorbeeld de server global voor de query-string, dit kan jij prima vervangen door een POST methode.
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
@Tommy, dat doet hij wel, maar 8^64 is echt veel... Dat wrs buiten de float limiet. Complexe berekeningen als 5-2log(5+6*2) doet hij gewoon hoor.
Richard van Velzen
Richard van Velzen
17 jaar geleden
 
0 +1 -0 -1
Pim: leuk gedaan, wat een eer :-)

Om nog grotere getallen aan te kunnen zou je misschien kunnen overwegen iets als bcmath te gebruiken. Dan is dat geen probleem. :-)

Edit: en het is jammer dat ik geen whitespace kan gebruiken. Zou toch niet zo moeilijk moeten zijn? :]
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
Ja, ik ga me wel even verdiepen in de ingewikkeldere math functies.

Maar hoezo zou je in een berekening whitespaces willen gebruiken? Nu worden ze er gewoon uit gestript, leek mij het handigst.
Onbekend Onbekend
Onbekend Onbekend
17 jaar geleden
 
0 +1 -0 -1
Ik kan pi() en M_PI niet gebruiken..
Afra ca
Afra ca
17 jaar geleden
 
0 +1 -0 -1
Een wonderlijk script. Zit heel prima in elkaar voor zover ik kan zien.
Pim -
Pim -
17 jaar geleden
 
0 +1 -0 -1
@Tommy
Dat werkt nu ook. Let wel op dat je een constant als getal moet zien, dus 5*pi ipv 5pi. Alle verkorte schrijfwijzen maken het echt heel veel complexer.
Edit: Of gebruik voor een natuurlijk logaritme elog10, waarbij e dus de constant is.
Johan vermeire
johan vermeire
17 jaar geleden
 
0 +1 -0 -1
kan mij iemand laten zien hoe je die navbar gencetreerd krijgt, ik zit hier al heel de middag te klooien en het werkt maar niet.
Victor Php
Victor Php
17 jaar geleden
 
0 +1 -0 -1
Ik heb nog niks gelezen alleen voorbeeld gezien:P
Hij loopt vast bij sommen als 6-2x3 :P
6-(2+3) vond ie ook niet goed xD
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen


17 jaar geleden
 
0 +1 -0 -1
Quote:
victor schreef op 13.12.2009 15:31
Ik heb nog niks gelezen alleen voorbeeld gezien:P
Hij loopt vast bij sommen als 6-2x3 :P
6-(2+3) vond ie ook niet goed xD

Duhuhuhuh. X is over het algemeen in de wiskunde een onbekende. Als je wilt vermenigvuldigen dan moet je natuurlijk * gebruiken.
Ik zie niet wat hij niet goed vond aan 6-(2+3). Krijg gewoon net 1 terug.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. calculatie-parser

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.