C# Math calculator
Solution 1
DataTable has a Compute method that allows you to write this:
var result = new DataTable().Compute("2-3/4*12", null);
Note that this is limited to simple math expressions.
Other option consist in using a dynamic language in the DLR such as IronPython and IronRuby. Check-out this post:
var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");
You may also check the NCalc library on GitHub.
Solution 2
There are some interesting options available to you.
NCalc - a C# Lexer Parser built with ANTLR. This will parse your text and allow you to assign values to parameters / variables. The interpreter is C#, so you do not have to load additional assemblies in an app domain, etc.
JINT - a C# based Javascript interpreter built by the same author of ECalc using ANTLR to create the grammar. This is currently in beta but works well with calculations and functions.
CS-Script.Net - From the site: "CS-Script is a CLR (Common Language Runtime) based scripting system which uses ECMA-compliant C# as a programming language. CS-Script currently targets Microsoft implementation of CLR (.NET 2.0/3.0/3.5) with limited support on Mono." The load scripts and create assemblies in memory and separate app domain. It is quite robust, and I use it in production for embedded scripting.
Solution 3
NB: This answer is just for completeness. It's definitely not an approach that I'd recommend.
It's possible to access the (deprecated) JScript libraries directly from C#, which means that you can use the equivalent of JScript's eval
function.
using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll
// ...
string expr = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr)); // displays -7
// ...
public static VsaEngine _engine = VsaEngine.CreateEngine();
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
Solution 4
Check out FLEE (Fast Lightweight Expression Evaluator) - http://flee.codeplex.com/
Flee is an expression parser and evaluator for the .NET framework. It allows you to compute the value of string expressions such as sqrt(a^2 + b^2) at runtime. It uses a custom compiler, strongly-typed expression language, and lightweight codegen to compile expressions directly to IL. This means that expression evaluation is extremely fast and efficient. Try out the demo, which lets you generate images based on expressions, and see for yourself.
It's free and fast and I've used it in a couple of projects.
Solution 5
Definitely in the "do not recommend" category, but for completeness -- if you've got a database you can conveniently connect to, send it the query "SELECT expression".
Related videos on Youtube
gapo
Updated on July 09, 2022Comments
-
gapo almost 2 years
Possible Duplicates:
Is there a string math evaluator in .NET?
Converting string expression to Integer Value using C#
Best and shortest way to evaluate mathematical expressions
c# evaluating string “3*(4+2)” yield int 18Is there a way to calculate math expressions like (2-3/4*12) in a different way than presented here?
-
Dour High Arch almost 14 years
-
-
Admin almost 14 yearsInteresting. Never knew such a thing existed!
-
David Robbins almost 14 yearsLooks cool. Can you share how you've used it other than for standard expression eval; e.g. how did it affect your architecture, etc.
-
GreyCloud over 13 yearsI second NCalc - i've used it extensively and found it very stable.
-
David Robbins over 13 yearsOn a different note, the NCalc guys have a C# javascript interpreter called Jint on codeplex.com I've played with it a little and can execute John Resig's original microtemplate.js with it.
-
MasterMastic almost 10 years+! FLEE is unbelievably awesome and incredibly easy to use.
-
Mohamad Shiralizadeh over 9 yearsHow does
Compute
works? Using SQL Server to run? -
froggythefrog over 9 yearsUsing DataTable to compute string expressions is kind of hoaky, but you've shown a very short concise way to use it. Kudos.
-
froggythefrog over 9 yearsMohamad... You don't need to have SQL Server running anywhere or an active SQL connection to invoke the function. All you need is the System.Data library.