/// <summary> /// 根据函数名获取函数 /// </summary> /// <param name="fName"></param> /// <returns></returns> public static DelExpressFunctionHandle GetHandle(string fName) { DelExpressFunctionHandle ret = null; dicHandle.TryGetValue(fName, out ret); return(ret); }
/// <summary> /// 计算表达式的值 /// </summary> /// <returns></returns> private double Eval() { LinkedList <double> stkNumber = new LinkedList <double>(); //数字 LinkedList <char> stkSymbol = new LinkedList <char>(); //运算符 StringBuilder tmpNumber = new StringBuilder(); while (strEnum.MoveNext()) { char cur = strEnum.Current; if (cur == '(') //如果是左括号就开始算表达式 { stkChr.Push(')'); double num = 0; if (tmpNumber.Length > 0) { DelExpressFunctionHandle handle = ExpressFunctions.GetHandle(tmpNumber.ToString().ToLower()); if (handle == null) { throw new Exception("找不到函数" + tmpNumber.ToString()); } List <double> lstParams = new List <double>(); while (stkChr.Count > 0 && stkChr.Peek() == ')') { lstParams.Add(Eval()); } num = handle(lstParams.ToArray()); tmpNumber.Remove(0, tmpNumber.Length); } else { num = Eval(); } stkNumber.AddLast(num); } else if (cur == ',') { if (stkChr.Count < 0) { throw new Exception("表达式错误"); } break; } else if (cur == ')')//表达式结束,跳出循环 { if (stkChr.Count < 0) { throw new Exception("表达式错误"); } stkChr.Pop(); break; } else { //if (IsNumber(cur))//如果是数组就加到临时数字字符串 //{ // tmpNumber.Append(cur); // continue; //} //else if (IsOperators(cur)) //如果是符号 { stkSymbol.AddLast(cur); //加到符号列表 if (tmpNumber.Length > 0) { stkNumber.AddLast(GetNumber(tmpNumber)); //加到数字列表 tmpNumber.Remove(0, tmpNumber.Length); //清空临时数字字符串 } } else { tmpNumber.Append(cur); continue; } } } if (tmpNumber.Length > 0) { stkNumber.AddLast(GetNumber(tmpNumber));//加到数字列表 } return(Calculation(stkNumber, stkSymbol)); }