Exemplo n.º 1
0
        /// <summary>
        /// 根据函数名获取函数
        /// </summary>
        /// <param name="fName"></param>
        /// <returns></returns>
        public static DelExpressFunctionHandle GetHandle(string fName)
        {
            DelExpressFunctionHandle ret = null;

            dicHandle.TryGetValue(fName, out ret);
            return(ret);
        }
Exemplo n.º 2
0
        /// <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));
        }