Beispiel #1
0
        /// <summary>
        /// 开始计算
        /// </summary>
        public object DoCal(string str)
        {
            HList.Clear();
            Vlist.Clear();
            cu = new CalUtility(str);

            FormaItem formaItem = cu.getItem();

            while (true)
            {
                if (formaItem.Typ == FormaItemType.Number)
                {
                    //如果是数值,则写入数据栈
                    Vlist.Add(formaItem.Name);
                }
                else if (formaItem.Typ == FormaItemType.Operator)
                {
                    //数值
                    Cal(formaItem.Name);
                }
                else if (formaItem.Typ == FormaItemType.Tag)
                {
                    Vlist.Add(model.GetTagValue(formaItem.Name).ToString());
                }
                else
                {
                    Cal("");
                    break;
                }

                formaItem = cu.getItem();
            }
            return(Vlist[0]);
        }
Beispiel #2
0
        /// <summary>
        /// 取段,自动分析数值或计算符
        /// </summary>
        /// <returns></returns>
        public FormaItem getItem()
        {
            FormaItem result = new FormaItem();

            //结束了
            if (iCurr == iCount)
            {
                result.Name = "";
                result.Typ  = FormaItemType.EndForma;
                return(result);
            }

            char ChTmp = StrB[iCurr];

            if (IsOper(ChTmp))
            {
                iCurr++;
                result.Name = ChTmp.ToString();
                result.Typ  = FormaItemType.Operator;
                return(result);
            }

            result.Typ = FormaItemType.Number;
            StringBuilder strTmp = new StringBuilder();

            while (true)
            {
                // if (char.IsLetterOrDigit(ChTmp) || ChTmp == '.')
                if (!char.IsControl(ChTmp) && !char.IsWhiteSpace(ChTmp))
                {
                    strTmp.Append(ChTmp);

                    if (!IsNum(ChTmp))
                    {
                        result.Typ = FormaItemType.Tag;
                    }
                }

                iCurr++;

                if (iCurr == iCount)
                {
                    break;
                }
                ChTmp = StrB[iCurr];
                if (IsOper(ChTmp))
                {
                    if (strTmp.Length == 0)
                    {
                        strTmp.Append(ChTmp);
                        result.Typ = FormaItemType.Operator;
                        iCurr++;
                    }
                    break;
                }
            }


            result.Name = strTmp.ToString();
            if (result.Name == "")
            {
                result.Typ = FormaItemType.EndForma;
            }
            return(result);
        }
Beispiel #3
0
        /// <summary>
        /// 开始计算
        /// </summary>
        public object DoCal(string str)
        {
            /// 算术符栈
            ArrayList HList = new ArrayList();
            /// 数值栈
            ArrayList Vlist = new ArrayList();

            //读算试工具
            CalUtility cu = new CalUtility(str);

            FormaItem formaItem = cu.getItem();

            while (true)
            {
                if (formaItem.Typ == FormaItemType.Number)
                {
                    //如果是数值,则写入数据栈
                    Vlist.Add(formaItem.Name);
                }
                else if (formaItem.Typ == FormaItemType.Tag)
                {
                    Vlist.Add(GetTagValue(formaItem.Name).ToString());
                }
                else
                {
                    string opStr = formaItem.Name;
                    while (HList.Count > 0)
                    {
                        //比较优先级
                        if (of.MoreThen(HList[HList.Count - 1].ToString(), opStr))
                        {
                            if (HList[HList.Count - 1].ToString().Equals("("))
                            {
                                if (opStr.Equals(")")) //符号是否可以对消?
                                {
                                    HList.RemoveAt(HList.Count - 1);
                                    if (HList.Count > 0)
                                    {
                                        opStr = HList[HList.Count - 1].ToString();
                                        HList.RemoveAt(HList.Count - 1);
                                    }
                                }
                                else
                                {
                                    break;
                                }
                            }
                            else
                            {
                                //如果新来操作符优先级低,则计算前面的运算符
                                IOper p = of.CreateOper(HList[HList.Count - 1].ToString());
                                if (p != null)
                                {
                                    Vlist[Vlist.Count - 2] = p.Oper(Vlist[Vlist.Count - 2], Vlist[Vlist.Count - 1]);
                                    HList.RemoveAt(HList.Count - 1);
                                    Vlist.RemoveAt(Vlist.Count - 1);
                                }
                                else
                                {
                                    break;
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (!opStr.Equals(""))
                    {
                        HList.Add(opStr);
                    }
                    else
                    {
                        break;
                    }
                }

                formaItem = cu.getItem();
            }
            return(Vlist[0]);
        }