创建动态公式 [英] Creating dynamic formula

查看:57
本文介绍了创建动态公式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要创建一个用户可以建立公式的ui.即:

I need to create a ui that user will build up a formula. ie:

其中一项公式为:

费用*项目/100

对于其他项目:

项目* 5/100

我希望用户能够通过Web ui生成公式.

I want the user to be able to generate the formula via web ui.

然后,当用户输入要计算结果的变量时.

Then when the user enters the variables i want to calculate the result.

是否有任何软件包或插件可以做到这一点?

Are there any packages or plugins to do this?

谢谢.

推荐答案

DarthVader!

DarthVader!

这里有两种选择,这取决于您的需求以及您是否需要非常复杂的东西或仅是易于理解和扩展的东西(也许出于学术目的).

There are a couple options here and it depends on your needs and whether you need something very complex or something just simple to understand and expand upon (maybe for academic purposes).

1)让我们从简单,容易和可自定义开始.我创建了一个满足您在帖子上指定的需求的类,但是它是非常原始的,未经进一步测试和修改,不应该用于商业项目中.想要...它显示了一种实现所需需求的简单方法.该代码运行良好,但没有考虑数学优先级(例如括号或* over +).需要对此进行修改... 代码在下面,它被注释并且希望可以自我解释:

1) Let's start with simple, easy and customizable. I have created a class that meets the needs you've specified on your post, however it is very raw and should NOT be used in commercial projects without further testing and modification... You can easily pick it up and increment upon it if you want... It shows a simple way to achieve what you need. The code works nicely but does not take into account math priorities (such as parentheses or * over +). It needs to be adapted in order to do so... Code is below, it is commented and hopefully self explanatory:

public class DynamicFormula
{
    /// <summary>
    /// This simply stores a variable name and its value so when this key is found in a expression it gets the value accordingly.
    /// </summary>
    public Dictionary<string, double> Variables { get; private set; }

    /// <summary>
    /// The expression itself, each value and operation must be separated with SPACES. The expression does not support PARENTHESES at this point.
    /// </summary>
    public string Expression { get; set; }

    public DynamicFormula()
    {
        this.Variables = new Dictionary<string, double>();
    }

    public double CalculateResult()
    {
        if (string.IsNullOrWhiteSpace(this.Expression))
            throw new Exception("An expression must be defined in the Expression property.");

        double? result = null;
        string operation = string.Empty;

        //This will be necessary for priorities operations such as parentheses, etc... It is not being used at this point.
        List<double> aux = new List<double>();  

        foreach (var lexema in Expression.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries))
        {
            //If it is an operator
            if (lexema == "*" || lexema == "/" || lexema == "+" || lexema == "-")
            {
                operation = lexema;
            }
            else //It is a number or a variable
            {
                double value = double.MinValue;
                if (Variables.ContainsKey(lexema.ToLower())) //If it is a variable, let's get the variable value
                    value = Variables[lexema.ToLower()];
                else //It is just a number, let's just parse
                    value = double.Parse(lexema);

                if (!result.HasValue) //No value has been assigned yet
                {
                    result = value;
                }
                else
                {
                    switch (operation) //Let's check the operation we should perform
                    {
                        case "*":
                            result = result.Value * value;
                            break;
                        case "/":
                            result = result.Value / value;
                            break;
                        case "+":
                            result = result.Value + value;
                            break;
                        case "-":
                            result = result.Value - value;
                            break;
                        default:
                            throw new Exception("The expression is not properly formatted.");
                    }
                }
            }
        }

        if (result.HasValue)
            return result.Value;
        else
            throw new Exception("The operation could not be completed, a result was not obtained.");
    }
    /// <summary>
    /// Add variables to the dynamic math formula. The variable should be properly declared.
    /// </summary>
    /// <param name="variableDeclaration">Should be declared as "VariableName=VALUE" without spaces</param>
    public void AddVariable(string variableDeclaration)
    {            
        if (!string.IsNullOrWhiteSpace(variableDeclaration))
        {
            var variable = variableDeclaration.ToLower().Split('=');    //Let's make sure the variable's name is LOWER case and then get its name/value
            string variableName = variable[0];
            double variableValue = 0;

            if (double.TryParse(variable[1], out variableValue))
                this.Variables.Add(variableName, variableValue);
            else
                throw new ArgumentException("Variable value is not a number");
        }
        else
        {
            //Could throw an exception... or just ignore as it not important...
        }
    }
}

这里是在WPF应用程序中使用上述类的示例(可以在任何C#应用程序中使用)

Here is an example using the class above in a WPF application (can be used in any C# application)

    private void btCalculate_Click(object sender, RoutedEventArgs e)
    {
        string expression = tboxExpression.Text;    //"cost * item / 100" (IT MUST BE SEPARATED WITH SPACES!)
        string variable1 = tboxVariable1.Text;      //"item=10"
        string variable2 = tboxVariable2.Text;      //"cost=2.5"

        DynamicFormula math = new DynamicFormula();
        math.Expression = expression;   //Let's define the expression
        math.AddVariable(variable1);    //Let's add the first variable
        math.AddVariable(variable2);    //Let's add the second variable

        try
        {
            double result = math.CalculateResult(); //In this scenario the result is 0,25... cost * item / 100 = (2.5 * 10 / 100) = 0,25
            //Console.WriteLine("Success: " + result);
            tboxResult.Text = result.ToString();
        }
        catch(Exception ex)
        {
            //Console.WriteLine(ex.Message);
            tboxResult.Text = ex.Message;
        }
    }

2)如果您需要更强大的功能,并且在大多数现实生活中需要使用FLEE,请务必进行检查: http://flee.codeplex.com/wikipage?title=Examples&referringTitle=Home

2) If you need something more robust and for most real life situations, you should definitively check out FLEE: http://flee.codeplex.com/wikipage?title=Examples&referringTitle=Home

这是专门为此创建的库,它支持多个公式! 可能需要一些时间才能看到一些示例并了解其工作原理,但它应该无需太多工作即可完成工作.

This is a library made specifically for that and it supports several formulas! It may take sometime to see some examples and understanding how it works but it should get the job done without much work.

希望有帮助,

路易斯·亨里克·高尔.

Luís Henrique Goll.

这篇关于创建动态公式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆