WinForm/C# C# 自动计算字符串公式的四种方法

xinggang · 2016年11月24日 · 149 次阅读

C# 开发中经常会遇到公式计算如采购业务中 [数量]*[单价]=[金额],这时我们可以为列配置公式表达式,在 CellValueChanged 事件中调用公式计算的逻辑,虽然我们的平台已经集成这个功能,但还是想分享一下实现方法,下面网上搜集了四种方式:

  1. 简单粗暴:利用 SQL 数据库计算
  2. 功能强大:利用 JavaScript 计算
  3. 看不懂:后序式计算
  4. 简单好用:DataTable 的 Compute 方法
    20161122212533246
    1、SQL 方法:
/// <summary>
/// 最简单的方式由SQL计算
/// </summary>
/// <param name="expression">表达式</param>
/// <returns></returns>
public static float CalcBySQL(string expression)
{
    string SQL = "SELECT " + expression + " AS RESULT_VALUE";
    SqlConnection conn = new SqlConnection("自己定义连接字符串");
    SqlCommand cmd = new SqlCommand(SQL, conn);
    object o = cmd.ExecuteScalar(); //执行SQL.
    return float.Parse(o.ToString());
}

2、JScript

/// <summary>
///  Microsoft.Eval对象计算表达式,需要引用Microsoft.JScriptMicrosoft.Vsa名字空间。
/// </summary>
/// <param name="expression">表达式</param>
/// <returns></returns>
public static float CalcByJs(string expression)
{
    Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
    object returnValue = Microsoft.JScript.Eval.JScriptEvaluate((object)expression, ve);
    return float.Parse(returnValue.ToString());
}

3、中序式转换成后序式

/// <summary>
/// 由中序式转换成后序式,再用栈来进行计算
/// </summary>
/// <param name="expression">表达式</param>
/// <returns></returns>
public static float CalcByCalcParenthesesExpression(string expression)
{
    string result = new CalcParenthesesExpression().CalculateParenthesesExpression(expression);
    return float.Parse(result);
}

4、利用 DataTable 的 Compute 方法(推荐)

/// <summary>
/// DataTable计算公式
/// </summary>
/// <param name="expression">表达式</param>
internal static float CalcByDataTable(string expression)
{
    object result = new DataTable().Compute(expression, "");
    return float.Parse(result + "");
}

其中第 4 种方法最简单方便,第 3 种方法 CalculateParenthesesExpression() 代码有点多,也没研究,不贴了,网上可以找到。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册