ExpressionEvaluationRuntime is a mathematical expressions evaluator library written in C# derived from the MathEval project. Allows to evaluate mathematical, boolean, string and datetime expressions. Code is written in pure C#, run on the fly. We don't use any third party libraries or packages. If you get any bugs please let me know by creating a new issue.
Many thanks to our contributors: Thanhrin (from Da Nang, VietNam) Eduardo Salinas (from Huesca, Spain) MathEval (from Matheval)
Using Package Manager
PM> Install-Package ExpressionEvaluationRuntime
The libary supports all what is supported in the origibal MathEval library documented here: https://matheval.org/math-expression-eval-for-c-sharp/
Operator | Description |
---|---|
+ | Additive operator / Unary plus / Concatenate string / Datetime addition |
& | Concatenate string |
– | Subtraction operator / Unary minus / Datetime subtraction |
* | Multiplication operator, can be omitted in front of an open bracket |
/ | Division operator |
% | Remainder operator (Modulo) |
^ | Power operator |
Conditional statement | Description |
---|---|
IF(logical_condition, value_if_true, value_if_false) | Example: `IF(2>1,"Pass","Fail")` |
SWITCH(expression, val1,result1, [val2,result2], …, [default]) | Example: `SWITCH(3+2,5,"Apple",7,"Mango",3,"Good","N/A")` |
Function* | Description |
---|---|
AND(logical1, [logical2], …) | Determine if all conditions are TRUE |
OR(logical1, [logical2], …) | Determine if any conditions in a test are TRUE |
NOT(_logical_) | To confirm one value is not equal to another |
XOR(logical1, [logical2], …) | Exclusive OR function |
SUM(number1, [number2],…) | Return sum of numbers supplied |
AVERAGE(number1, [number2],…) | Return average of numbers supplied |
MIN(number1, [number2],…) | Return the smallest value from the numbers supplied |
MAX(number1, [number2],…) | Return the biggest value from the numbers supplied |
MOD(number, divisor) | Get remainder of two given numbers after division operator. |
ROUND(number, num_digits) | Returns the rounded approximation of given number using half-even rounding mode ( you can change to another rounding mode) |
FLOOR(number, significance) | Rounds a given number towards zero to the nearest multiple of a specified significance |
`CEILING`(number, significance) | Rounds a given number away from zero, to the nearest multiple of a given number |
POWER(number, power) | Returns the result of a number raised to a given power |
RAND() | Produces a random number between 0 and 1 |
SIN(number) | Returns the trigonometric sine of the angle given in radians |
SINH(number) | Returns the hyperbolic sine of a number |
ASIN(number) | Returns the arc sine of an angle, in the range of -pi/2 through pi/2 |
COS(number) | Returns the trigonometric cos of the angle given in radians |
COSH(number) | Returns the hyperbolic cos of a number |
ACOS(number) | Returns the arc cosine of an angle, in the range of 0.0 through pi |
TAN(number) | Returns the tangent of the angle given in radians |
TANH(number) | Returns the hyperbolic tangent of a number |
ATAN(number) | Returns the arc tangent of an angle given in radians |
ATAN2(x_number, y_number) | Returns the arctangent from x- and y-coordinates |
COT(number) | Returns the cotangent of an angle given in radians. |
COTH(number) | Returns the hyperbolic cotangent of a number |
SQRT(number) | Returns the correctly rounded positive square root of given number |
LN(number) | Returns the natural logarithm (base _e_) of given number |
LOG10(number) | Returns the logarithm (base 10) of given number |
EXP(number) | Returns e raised to the power of given number |
ABS(number) | Returns the absolute value of given number |
FACT(number) | Returns the factorial of a given number |
SEC(number) | Returns the secant of an angle given in radians |
CSC(number) | Returns the cosecant of an angle given in radians |
PI() | Return value of Pi |
RADIANS(degrees) | Convert degrees to radians |
DEGREES(radians) | Convert radians to degrees |
INT(number) | Returns the Integer value of given number |
Constant | Description |
---|---|
e | The value of _e_ |
PI | The value of _PI_ |
TRUE | The boolean true value |
FALSE | The boolean false value |
NULL | The null value |
Function | Description |
---|---|
LEFT(text, num_chars) | Extracts a given number of characters from the left side of a supplied text string |
RIGHT(text, num_chars) | Extracts a given number of characters from the right side of a supplied text string |
MID(text, start_num, num_chars) | Extracts a given number of characters from the middle of a supplied text string |
REVERSE(text) | Reverse a string |
ISNUMBER(text) | Check if a value is a number |
LOWER(text) | Converts all letters in the specified string to lowercase |
UPPER(text) | Converts all letters in the specified string to uppercase |
PROPER(text) | Capitalizes words given text string |
TRIM(text) | Removes extra spaces from text |
LEN(text) | Returns the length of a string/ text |
TEXT(value, [format_text]) | Convert a numeric value into a text string. You can use the TEXT function to embed formatted numbers inside text
Example:
`
TEXT(123) -> 123
TEXT(DATEVALUE("2021-01-23"),"dd-MM-yyyy") -> 23-01-2021
TEXT(2.61,"hh:mm") -> 14:38
TEXT(2.61,"[hh]") -> 62
TEXT(2.61,"hh-mm-ss") -> 14-38-24
TEXT(DATEVALUE("2021-01-03")-DATEVALUE("2021-01-01"),"[h]") -> 48
TEXT(TIME(12,00,00)-TIME(10,30,10),"hh hours and mm minutes and ss seconds") -> "01 hours and 29 minutes and 50 seconds"
`TEXT(TIME(12,00,00)-TIME(10,30,10),"hh hours and mm minutes and ss seconds") -> "01 hours and 29 minutes and 50 seconds"`` |
REPLACE(old_text, start_num, num_chars, new_text) | Replaces characters specified by location in a given text string with another text string |
SUBSTITUTE(text, old_text, new_text) | Replaces a set of characters with another |
FIND(find_text, within_text, [start_num]) | Returns the location of a substring in a string (case sensitive) |
SEARCH(find_text, within_text, [start_num]) | Returns the location of a substring in a string (case insensitive) |
CONCAT(text1, text2, text3,…) | Combines the text from multiple strings |
ISBLANK(text) | Returns TRUE when a given string is null or empty, otherwise return FALSE |
REPT(text, repeat_time) | Repeats characters a given number of times |
CHAR(char_code) | Return character from ascii code |
CODE(char) | Returns a ascii code of a character |
VALUE(text) | Convert numbers stored as text to numbers |
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression expression = new Expression("(a + b) / 2 ");
expression.Bind("a", 3);
expression.Bind("b",5);
Object value = expression.Eval();
Console.WriteLine("Result: "+value); //Result: 4
}
}
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression expression = new Expression("IF(time>8, (HOUR_SALARY*8) + (HOUR_SALARY*1.25*(time-8)), HOUR_SALARY*time)");
//bind variable
expression.Bind("HOUR_SALARY", 10);
expression.Bind("time", 9);
//eval
Decimal salary = expression.Eval<Decimal>();
Console.WriteLine(salary); //return 92.5
}
}
Expression expression = new Expression("SUM(1,2,3) + true");
List<String> errors = expression.GetError();
if(errors.Count > 0)
{
foreach(String error in errors)
{
Console.WriteLine(error);
}
}
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression expr = new Expression("MIN(2,3,16)");
int min = expr.Eval<int>();
Console.WriteLine(min);// return 2 (min)
expr.SetFomular("Max(2,3,16)");
int max = expr.Eval<int>();
Console.WriteLine(max);// return 16 (max)
expr.SetFomular("Sum(2,3,16)");
decimal sum = expr.Eval<decimal>();
Console.WriteLine(sum);// return 21 (sum)
expr.SetFomular("average(2,3,16)");
decimal average = expr.Eval<decimal>();
Console.WriteLine(average);// return 7 (average)
}
}
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression expr = new Expression("ROUND(2.149, 1)");
Object value = expr.Eval<Decimal>();
Console.WriteLine("ROUND(2.149, 1) = "+value); //return 2.1
expr = new Expression("FLOOR(2.149)");
value = expr.Eval();
Console.WriteLine("FLOOR(2.149) = "+value); //return 2
expr = new Expression("FLOOR(3.7,2)");
value = expr.Eval();
Console.WriteLine("FLOOR(3.7,2) = "+value); //return 2
expr = new Expression("CEILING(2.149)");
value = expr.Eval();
Console.WriteLine("CEILING(2.149) = "+value); //return 3
expr = new Expression("CEILING(1.5, 0.1)");
value = expr.Eval();
Console.WriteLine("CEILING(1.5, 0.1) = "+value); //return 1.5
}
}
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression expr = new Expression("tan(a)^3-((3*sin(a)-sin(3*a))/(3*cos(a)+cos(3*a)))");
Decimal value = expr.Bind("a", Math.PI/6).Eval<Decimal>();
Console.WriteLine(value); //return 0
}
}
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression taxExpr = new Expression("IF(LOWER(TAX_CODE)='vat',amount*10/100,IF(LOWER(TAX_CODE)='gst',amount*15/100,0))");
taxExpr.Bind("TAX_CODE","GST");
taxExpr.Bind("amount", 5005m);
Decimal value = taxExpr.Eval<Decimal>();
Console.WriteLine(value);
}
}
using System;
using ExpressionEvaluation.Runtime;
public class Program
{
public static void Main()
{
Expression expr = new Expression("CONCAT('The United States of ', 'America')");
String value = expr.Eval<String>();
Console.WriteLine(value);//The United States of America
}
}
MIT license