Flee是GitHub上基于.net的轻量级数学表达式解析和计算器,它支持计算数学表达式、带变量的数学表达式、带特殊处理函数的数学表达式等。从微信公众号中看到关于Flee的介绍文章(参考文献1是百度出来的同名的博客文章),准备测试一下,使用该模块计算数学表达式及带变量的数学表达式。
使用VS2019创建Winform程序,通过NuGet查找并安装Flee包及依赖项,如下图所示:
使用Flee计算不带变量和特殊处理函数的数学表达式很简单,直接使用其官网给的示例代码即可,测试代码及运行界面如下图所示。
try
{
ExpressionContext context = new ExpressionContext();
IDynamicExpression calcResult = context.CompileDynamic(txtExpression.Text);
txtResult.Text =Convert.ToString(calcResult.Evaluate());
}
catch (ExpressionCompileException ex)
{
if (ex.Reason == CompileExceptionReason.SyntaxError)
{
txtResult.Text = "Check your expression syntax" + "\r\n" + ex.Message;
}
else
{
txtResult.Text = ex.Message;
}
}
接下来测试带变量的数学表达式,这时最重要的是ExpressionContext类,该类用于保存表达式中的变量,测试代码及运行界面如下图所示。
try
{
ExpressionContext context = new ExpressionContext();
foreach(DataGridViewRow dgvr in dgvParams.Rows)
{
decimal tmpValue = 0;
if(string.IsNullOrEmpty(Convert.ToString(dgvr.Cells[0].Value))
|| !decimal.TryParse(Convert.ToString(dgvr.Cells[1].Value),out tmpValue))
{
continue;
}
context.Variables[Convert.ToString(dgvr.Cells[0].Value)] = tmpValue;
}
IDynamicExpression calcResult = context.CompileDynamic(txtExpression.Text);
txtResult.Text =Convert.ToString(calcResult.Evaluate());
}
catch (ExpressionCompileException ex)
{
if (ex.Reason == CompileExceptionReason.SyntaxError)
{
txtResult.Text = "Check your expression syntax" + "\r\n" + ex.Message;
}
else
{
txtResult.Text = ex.Message;
}
}
Flee的功能比较强大,本文只是测试了其中的最简单的使用方式,后续还会继续学习Flee的用法。
参考文献:
[1]https://github.com/mparlak/Flee
[2]https://github.com/mparlak/Flee/wiki/Examples