Ankündigung

Einklappen
Keine Ankündigung bisher.

Mathematische Berechnung vom Stringinhalt

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • halskrause
    hat ein Thema erstellt Mathematische Berechnung vom Stringinhalt.

    Mathematische Berechnung vom Stringinhalt

    Hi. Ich stehe vor einem Problem. Undzwar muss ich eine mathematische Berechnung von einem Stringinhalt durchführen. Folgendes habe ich schon versucht...

    PHP-Code:
    $test     =    "17+3";
    $test2    =    (int)$test;
    echo 
    $test ."<BR>"// Ausgabe  "17+4"
    echo $test2;  // Ausgabe  17 , hier soll jedoch 21 rauskommen 
    Irgendeiner eine Idee?

  • nikosch
    antwortet
    Wie oft kommt dieses Thema noch?

    Das Thema wurde bereits hinreichend behandelt. Bitte benutze die Forensuche und beachte diesen Thread!

    [MOD: Thread geschlossen]

    Einen Kommentar schreiben:


  • Jens Clasen
    antwortet
    Warum? Du kannst ja auch Klammern setzen.

    Ist aber schon richtig - das war der Hauptbeschiss. Dazu müsst man allerdings immer erst die komplette Formel einlesen und kann nicht wärend des Lesens von links nach rechts durch rechnen. Das krieg ich nur in der einen verfügbaren Zeile nicht mehr unter...

    Gruß Jens

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Zitat von Jens Clasen Beitrag anzeigen
    Sollte man allerdings ... Punkt-vor-Strich haben wollen, dann werdens wohl doch ne hand voll Zeilen mehr...
    Wär schon gut... weil anderenfalls kann ich auch gleich Zufallszahlen ausspucken - die wären genauso richtig, wie falsch gerechnete Ergebnisse

    Einen Kommentar schreiben:


  • Jens Clasen
    antwortet
    Behaupten kann man vieles Ich war mir mit meiner eigenen Behauptung allerdings selbst grad nicht mehr so sicher - zumindest was die Anzahl der Zeilen angeht.

    Ich hab das ganze also mal ausgetestet:

    PHP-Code:
    <?php
       
    function evaluate($str){
          
    $stack=$v=array();
          
    $v[0]=$v[1]=$op=null;
          if(
    preg_match_all('#[ ()+*/^-]|(\-?\d+)#',$str,$m))
            foreach(
    $m[0] as $tk)
              switch(
    $tk){
                case 
    '+': case '-': case '*': case '/': case '^'$op=$tk; break;          
                case 
    '('array_push($stack,array($v[0],$v[1],$op));
                          
    $v[0]=$v[1]=$op=null;
                          break;
                case 
    ')'$kResult=$v[0];
                          list(
    $v[0],$v[1],$op)=array_pop($stack);
                          
    $v[is_null($v[0])?0:1]=$kResult;
                          
    $bracketMode=true;
                default:  if(!
    $bracketMode)
                            
    $v[is_null($op) && is_null($v[0])?0:1]=$tk;
                          if(!
    is_null($v[1])){
                            
    $v[0]=math($v[0],$v[1],$op);
                            
    $op=$v[1]=null;
                          }
                          
    $bracketMode=false;
                          break; 
              }
            return 
    $v[0];
          }
          function 
    math($v1,$v2,$op){
            return ((
    $op=='+')*($v1+$v2))+(($op=='*')*($v1*$v2))+(($op=='/')*($v1/$v2))
                   +((
    $op=='-')*($v1-$v2))+(($op=='^')*pow($v1,$v2));
          }

      echo 
    evaluate('(7+9)+((9^2)/22)');
    ?>
    Mit Bescheißen gehen also wirklich 29 Zeilen Sollte man allerdings ein Fehlerhandling und Punkt-vor-Strich haben wollen, dann werdens wohl doch ne hand voll Zeilen mehr...

    Gruß Jens

    Einen Kommentar schreiben:


  • boolean
    antwortet
    Zitat von Jens Clasen Beitrag anzeigen
    Da würd ich mir aber wirklich eher nen Parser zu schreiben, bevor ich da mit eval anfange. Ein simpler Parser für Grunrechenarten, Klammern und ein bißchen Potenzrechnung braucht da ja nicht viel mehr als 20 bis 30 Zeilen Code.

    Gruß Jens
    Dito das würd ich auch mal behaupten. Eval geht mal gar nicht.

    Einen Kommentar schreiben:


  • robo47
    antwortet
    Parser basteln der dir das ganze in Tokens zerlegt und nen Interpreter der die Tokens dann passend interpretiert (dinge wie operatoren-gewichtung (Punkt vor Strich Rechnung, Klammerung, ... ), etc)

    alternativ der ganz unschöne und gefährliche weg, einen whitelistebasierten validator schreiben und dann das ganze als php-code via eval() ausführen, da solltest du aber nicht machen wenn das direkter user-input ist!!

    // damn ... wieder viel zu spät :P

    Einen Kommentar schreiben:


  • Jens Clasen
    antwortet
    Da würd ich mir aber wirklich eher nen Parser zu schreiben, bevor ich da mit eval anfange. Ein simpler Parser für Grunrechenarten, Klammern und ein bißchen Potenzrechnung braucht da ja nicht viel mehr als 20 bis 30 Zeilen Code.

    Gruß Jens

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    EDIT: eval schau ich mir auch mal an...

    Danke für den Ansatz.
    Ich habe das nun so ähnlich gelöst.
    PHP-Code:
    <?php
    $zahl1    
    =    17;
    $zahl2    =    4;
    $aufgabe    =    (string)"$zahl1 + $zahl2";
    $losung        =    $zahl1 $zahl2;

    echo 
    $aufgabe ."<BR>";
    echo 
    $losung;
    ?>

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    Höchstens mit eval()
    PHP-Code:
    eval ('$a = 3+5;');
    echo 
    $a

    Einen Kommentar schreiben:


  • boolean
    antwortet
    In einem String kannst du nicht rechnen.

    PHP-Code:
    $string '17+3';
    $array explode('+'$string);
    $result $array[0] + $array[1];
    echo 
    $result

    Einen Kommentar schreiben:

Lädt...
X