String calculator [closed]

2019-01-24 22:25发布

问题:

Hi fellow programmers,

I am creating a calculator in C#

and I have a string variable math which contains 100 * 5 - 2

How can I display its output which is 498 in my console?

My code is this:

String math = "100 * 5 - 2"; 

Console.WriteLine(math);

Console.ReadLine(); // For Pause

So basically, what my code will give me is the string itself which 100 * 5 - 2

but I want it to give me 498 as a result.

Idea about this is pretty much appreciated.

Thanks

回答1:

Regular Expression evaluation can be done using DataTable.Compute method (from MSDN) :

Computes the given expression on the current rows that pass the filter criteria.

Try this:

using System.Data;//import this namespace

 string math = "100 * 5 - 2";
 string value = new DataTable().Compute(math, null).ToString();


回答2:

Simply try this

String math = (100 * 5 - 2).ToString(); 

I don't know, Why you want more complex? It's very easy ..

And if you want surely that,You can do that by using EvaluateExpression

public int EvaluateExpression(string math )
    {
       return Convert.ToInt32(math);
    }

........................

String math = "100 * 5 - 2"; 

int result = EvaluateExpression(math );

Console.WriteLine(result );

See this discussions

Evaluating string "3*(4+2)" yield int 18

Update:

If those values came from input textbox, then write this way

String math = txtCalculator.Text.Trim();

    int result = EvaluateExpression(math );

    Console.WriteLine(result );

And also you can find out some pretty answer from this discussion

Is it possible to compile and execute new code at runtime in .NET?

Update 2:

Finally I have tried this sample for you :

My full code for class library

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.XPath;

public partial class _Default : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        String math = "100 * 5 - 2";

        Console.WriteLine(Evaluate(math));
    }

    public static double Evaluate(string expression)
    {
        var xsltExpression =
            string.Format("number({0})",
                new Regex(@"([\+\-\*])").Replace(expression, " ${1} ")
                                        .Replace("/", " div ")
                                        .Replace("%", " mod "));

        // ReSharper disable PossibleNullReferenceException
        return (double)new XPathDocument
            (new StringReader("<r/>"))
                .CreateNavigator()
                .Evaluate(xsltExpression);
        // ReSharper restore PossibleNullReferenceException
    }
}


回答3:

Try this

String math = (100*5-2).ToString();  

Console.WriteLine(math);

Demo



回答4:

You can compile code from string at runtime and execute it:

using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;

namespace DynamicCalcTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var result = new DynamicCalculator<double>("2 + 2 * 2").Execute();
        }
    }


    public class DynamicCalculator<T>
    {
        private MethodInfo _Method = null;

        public DynamicCalculator(string code)
        {
            _Method = GetMethodInfo(code);
        }

        public T Execute()
        {
            return (T)_Method.Invoke(null, null);
        }

        private MethodInfo GetMethodInfo(string code)
        {
            var tpl = @"
                public static class Calculator
                {{
                    public static double Calc()
                    {{
                        return {0};
                    }}
                }}";

            var finalCode = string.Format(tpl, code);

            var parameters = new CompilerParameters();
            parameters.ReferencedAssemblies.Add("mscorlib.dll");
            parameters.GenerateInMemory = true;
            parameters.CompilerOptions = "/platform:anycpu";

            var options = new Dictionary<string, string> { { "CompilerVersion", "v4.0" }     };

            var c = new CSharpCodeProvider(options);
            var results = c.CompileAssemblyFromSource(parameters, finalCode);

            var type = results.CompiledAssembly.GetExportedTypes()[0];
            var mi = type.GetMethod("Calc");
            return mi;
        }
    }
}