C# Math calculator

34,923

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.

  1. 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.

  2. 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.

  3. 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".

Share:
34,923

Related videos on Youtube

gapo
Author by

gapo

Updated on July 09, 2022

Comments