Skip to content

Evaluates a math expression from a string. Supports variables and custom operators.

License

Notifications You must be signed in to change notification settings

miroiu/string-math

Repository files navigation

V3 README can be found here: https://github.com/miroiu/string-math/tree/release-3.0.0

NEW! Boolean math example: https://github.com/miroiu/string-math/pull/6/files

String Math NuGet Downloads .NET

Calculates the value of a math expression from a string returning a double. Supports variables, user defined operators and expression compilation.

double result = "1 * (2 - 3) ^ 2".Eval(); // 1

Variables

double result = "{a} + 2 * {b}".Substitute("a", 2).Substitute("b", 3).Result; // 8

Global variables

These variables are inherited and cannot be substituted.

MathExpr.AddVariable("PI", 3.1415926535897931);
double result = "1 + {PI}".Eval(); // 4.1415926535897931

Custom operators

Global operators

These operators are inherited and can be overidden.

MathExpr.AddOperator("abs", a => a > 0 ? a : -a);
double result = "abs -5".Eval(); // 5

// Operator precedence (you can specify an int for precedence)
MathExpr.AddOperator("max", (a, b) => a > b ? a : b, Precedence.Power);
double result = new MathExpr("2 * 3 max 4").Result; // 8

Local operators

These are applied only to the target expression.

MathExpr expr = "{PI} + 1";
expr.SetOperator("+", (a, b) => Math.Pow(a, b));
double result = expr; // 3.1415926535897931

double result2 = "{PI} + 1".Eval(); // 4.1415926535897931

Advanced

Extract variables

var expr = "{a} + {b} + {PI}".ToMathExpr();
var variables = expr.Variables; // { "a", "b", "PI" }
var localVariables = expr.LocalVariables; // { "a", "b" }

Compilation

Func<double, double> fn = "{a} + 2".ToMathExpr().Compile("a");
double result = fn(5); // 7

Conditional substitution

MathExpr expr = "1 / {a}".Substitute("a", 1);

double temp = expr.Result; // 1

if (someCondition)  // true
 expr.Substitute("a", 2);

double final = expr.Result; // 0.5

Sharing math context

MathExpr expr = "{PI} + 1";
expr.SetOperator("+", (a, b) => Math.Pow(a, b));

MathExpr expr2 = "3 + 2".ToMathExpr(expr.Context);

double result = "1 + 2 + 3".Eval(expr.Context);

Custom math context

var context = new MathContext(); // new MathContext(MathContext.Default); // to inherit from global
context.RegisterBinary("+", (a, b) => Math.Pow(a, b));

MathExpr expr = new MathExpr("{PI} + 1", context);
MathExpr expr2 = "3 + 2".ToMathExpr(context);
double result = "1 + 2 + 3".Eval(context);

Default operators

Binary

+ (addition)
- (subtraction)
* (multiplication)
/ (division)
% (remainder)
^ (power)
log (logarithm)
max (maximum)
min (minimum)

Unary

- (negation)
! (factorial)
sqrt (square root)
sin (sine)
asin (arcsine)
cos (cosine)
acos (arccosine)
tan (tangent)
atan (arctangent)
rad (convert degrees to radians)
deg (convert radians to degrees)
ceil (ceiling)
floor (floor)
round (rounding)
exp (e raised to power)
abs (absolute)