Maciej Los
Это нелегкая работа. Я бы предложил начать здесь: Написание простых математических выражений в C#[^]
Эти статьи тоже могут быть полезны:
Механизм вычислений для .NET[^]
Синтаксический анализ математических выражений в VB.NET: миссия возможна[^]
[РЕДАКТИРОВАТЬ]
Я хотел бы сказать: для всех этих ленивых людей то, что я создал (основываясь на первой статье, упомянутой в этом ответе) очень, очень, очень простой и простой класс называется SingleMathExpressionEvaluator
Он способен вычислять одно математическое выражение только с одним арифметическим оператором за один раз.
void Main()
{
//string[] lines = File.ReadAllLines("fullFileNameHere.txt");
//tested on:
string[] lines = {"2 + 2", "10 + 12", "10 + -12", "9 + 7", "0 + 8", "5 - 3", "-2 + -3", "5 - -2",
"19 - 8", "9 * 4", "6 * 7", "5 * -8", "11 * 12", "16 / 4", "100 / 5", "-100 / -2", "36 / 9", "5 ^ 2", "-3 ^ 3"};
SingleMathExpressionEvaluator smee = new SingleMathExpressionEvaluator();
foreach(string line in lines)
{
Console.WriteLine($"{line} = {smee.Eval(line)}");
}
smee = null;
}
// Define other methods and classes here
class SingleMathExpressionEvaluator
{
private string pattern = @"-?\d+";
private Regex r = null;
public SingleMathExpressionEvaluator()
{
r = new Regex(pattern);
}
public double Eval(string expressiontext)
{
double left = 0.0;
double right = 0.0;
double result = 0.0;
string[] tokens = {" "};
//get mathematical operator
string token = r.Replace(expressiontext, "").Trim();
//get left and right side of mathematical expression
string[] nodes = expressiontext.Split(tokens, StringSplitOptions.RemoveEmptyEntries);
if(!Double.TryParse(nodes[0], out left)) Console.WriteLine("Left part of expression is not a number!");
if(!Double.TryParse(nodes[nodes.Length-1], out right)) Console.WriteLine("Right part of expression is not a number!");
switch(token)
{
case "+":
result = left + right;
break;
case "-":
result = left - right;
break;
case "*":
result = left * right;
break;
case "/":
result = left / right;
break;
case "^":
result = Math.Pow(left, right);
break;
}
return result;
}
}
Результат:
2 + 2 = 4
10 + 12 = 22
10 + -12 = -2
9 + 7 = 16
0 + 8 = 8
5 - 3 = 2
-2 + -3 = -5
5 - -2 = 7
19 - 8 = 11
9 * 4 = 36
6 * 7 = 42
5 * -8 = -40
11 * 12 = 132
16 / 4 = 4
100 / 5 = 20
-100 / -2 = 50
36 / 9 = 4
5 ^ 2 = 25
-3 ^ 3 = -27