2010-10-19 8 views
7

Gibt es eine einfache Möglichkeit, einen einfachen mathematischen Ausdruck als eine Zeichenfolge wie (x + (2 * x)/(1-x)) zu analysieren, einen Wert für x bereitzustellen und ein Ergebnis zu erhalten?Parse Math Ausdruck

Ich schaute auf die VSAEngine pro mehrere Online-Beispiele, aber ich bekomme eine Warnung, dass diese Assembly veraltet ist und nicht zu verwenden.

Wenn es irgendwelche Unterschiede macht, verwende ich .NET 4.0.

+0

ich für dieses Problem volle Quelle hier gepostet: http://stackoverflow.com/questions/174664/operators-as-strings –

+0

möglich Duplikat [Ist es möglich, neuen Code zur Laufzeit in .NET zu kompilieren und auszuführen?] (http://stackoverflow.com/questions/234217/is-it-possible-to-compile-and-execute-new-code-at-runtime- (in-net) – nawfal

+0

mögliches Duplikat von [Gibt es in .NET einen Stringmathematiker?] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net) –

Antwort

1

Eine weitere Option, die Sie untersuchen sollten, ist die expression evaluation-Funktionalität von Spring.NET Framework. Es kann viel mehr als nur Mathematik.

Das gesamte Spring.NET Framework ist jedoch möglicherweise etwas übertrieben für Ihre Anforderungen, wenn Sie den Rest der Funktionalität nicht benötigen.

10

Ich rate dringend davor zurück, einen vorhandenen generischen Ausdruck-Evaluator über einen speziell entwickelten mathematischen Evaluator zu wählen. Der Grund dafür ist, dass die Ausdruckbewerter nicht nur auf Mathematik beschränkt sind. Ein schlauer Mensch könnte dies verwenden, um eine Instanz eines beliebigen Typs im Framework zu erstellen und jede Methode des Typs aufzurufen, die es ihm erlauben würde, einige ausgesprochen unerwünschte Dinge zu tun. Zum Beispiel: new System.Net.WebClient().DownloadFile("illegalchildpornurl", "C:\openme.gif") wird in den meisten von denen gut, und tun genau das, was es klingt wie es würde (und machen Sie ein Verbrecher zur gleichen Zeit).

Dies bedeutet nicht, nicht nach etwas suchen, das bereits geschrieben wurde. Es bedeutet nur vorsichtig zu sein. Sie wollen eine, die Mathe und nur Mathe tut. Das meiste von dem, was schon da draußen ist, ist nicht so wählerisch.

0

Wie ich in diesem Thread (Best Free C# Math Parser using variables, user defined functions, custom operators) antwortete, können Sie Mathos Parser verwenden, die Sie einfach in Ihren Quellcode einfügen können.

 Mathos.Parser.MathParser parser = new Mathos.Parser.MathParser(); 

     string expr = "(x+(2*x)/(1-x))"; // the expression 

     decimal result = 0; // the storage of the result 

     parser.LocalVariables.Add("x", 41); // 41 is the value of x 

     result = parser.Parse(expr); // parsing 

     Console.WriteLine(result); // 38.95 
+0

Leider wird dieses Projekt bei Codeplex gehostet, das geschlossen wird. Ich kann es gerade nicht schaffen, die Quelle von Codeplex zu betrachten. Es wäre schön, wenn das Projekt auf Github oder Bitbucket o.ä. –

+0

@NicFoster, bitte sehen Sie sich https://github.com/MathosProject/Mathos-Parser an. Es gibt auch andere Versionen davon unter https://github.com/MathosProject. – Artem

0

Ich empfehle Ihnen, MEEL dafür zu verwenden.

// parse string to IExpression (symbolic type) 
IExpression expression = BaseExpression.Parse("(x+(2*x)/(1-x))"); 

// create your own collection for attributes 
var attributes = new MathAttributeCollection(); 
// create local variable named "x" with value 5 
var attributeX = new ScalarAttrInt("x") {Value = new ScalarConstInt(5)}; 
attributes.Add(attributeX); 

// execute math expression where x=5 
var result = expression.Execute(attributes); 

MessageBox.Show(result.GetText()); 
// result: 2.5 
5

Ich war vor kurzem mit mXparser, die eine mathematische Parser-Bibliothek ist. Es gibt Ihnen viel Flexibilität, wie Variablen, Funktionen, Konstanten, Operatoren. Im Folgenden finden Sie einige Beispiele für die Verwendung finden:

Beispiel 1 - einfache Formel

Expression e = new Expression("1 + pi"); 
double v = e.calculate(); 

Beispiel 2 - Formel mit Variablen, Funktionen etc.

Argument x = new Argument("x = 2"); 
Constant a = new Constant("a = sin(10)"); 
Function f = new Function("f(t) = t^2"); 
Expression e = new Expression("2*x + a - f(10)", x, a, f); 
double v = e.calculate(); 

https://mxparser.codeplex.com/

http://mathparser.org/

Mit freundlichen Grüßen

0

Hier ist eine Möglichkeit, es zu tun. Dieser Code ist in Java geschrieben. Beachten Sie, dass es momentan keine negativen Zahlen behandelt, aber Sie können das hinzufügen.

public class ExpressionParser { 
public double eval(String exp, Map<String, Double> vars){ 
    int bracketCounter = 0; 
    int operatorIndex = -1; 

    for(int i=0; i<exp.length(); i++){ 
     char c = exp.charAt(i); 
     if(c == '(') bracketCounter++; 
     else if(c == ')') bracketCounter--; 
     else if((c == '+' || c == '-') && bracketCounter == 0){ 
      operatorIndex = i; 
      break; 
     } 
     else if((c == '*' || c == '/') && bracketCounter == 0 && operatorIndex < 0){ 
      operatorIndex = i; 
     } 
    } 
    if(operatorIndex < 0){ 
     exp = exp.trim(); 
     if(exp.charAt(0) == '(' && exp.charAt(exp.length()-1) == ')') 
      return eval(exp.substring(1, exp.length()-1), vars); 
     else if(vars.containsKey(exp)) 
      return vars.get(exp); 
     else 
      return Double.parseDouble(exp); 
    } 
    else{ 
     switch(exp.charAt(operatorIndex)){ 
      case '+': 
       return eval(exp.substring(0, operatorIndex), vars) + eval(exp.substring(operatorIndex+1), vars); 
      case '-': 
       return eval(exp.substring(0, operatorIndex), vars) - eval(exp.substring(operatorIndex+1), vars); 
      case '*': 
       return eval(exp.substring(0, operatorIndex), vars) * eval(exp.substring(operatorIndex+1), vars); 
      case '/': 
       return eval(exp.substring(0, operatorIndex), vars)/eval(exp.substring(operatorIndex+1), vars); 
     } 
    } 
    return 0; 
} 

}

Sie müssen java.util.Map importieren.

Hier ist, wie ich diesen Code verwenden:

ExpressionParser p = new ExpressionParser(); 
    Map vars = new HashMap<String, Double>(); 
    vars.put("x", 2.50); 
    System.out.println(p.eval(" 5 + 6 * x - 1", vars));