解析字符串公式并计算出结果

 /// <summary>
        /// 解析字符串公式并计算出结果
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="formulaSring">字符串公式</param>
        /// <returns></returns>
        public decimal FormulaAmount(string year, string month, string formulaSring)
        {

            #region 运算符集合
            List<char> operatorChars = new List<char>();
            char[] formularCharacter = formulaSring.ToCharArray();
            foreach (var item in formularCharacter)
            {
                if (item.ToString() == "+" || item.ToString() == "-")
                {
                    operatorChars.Add(item);
                }
            }
            #endregion

            #region 值集合

            List<decimal> formulaNumber = new List<decimal>();

            char[] delimiterChars = { '+', '-' };
            string[] words = formulaSring.Split(delimiterChars);


            foreach (var word in words)
            {
                //逗号分割后,分别得到取值函数的参数
                //即取数方法与科目编码
                string[] formulaUnit = word.Split(',');

                //取数方法字符串
                FetchRegular fetchRegualar = (FetchRegular)Enum.Parse(typeof(FetchRegular), formulaUnit[0]);

                //科目编码字符串
                string accountCode = formulaUnit[1];

                //调用取数方法,返回运算表达式中的数值
                formulaNumber.Add(U8Amount(year, month, accountCode, fetchRegualar));
            }
            #endregion

            #region 组成计算式,并得出计算结果
            
            StringBuilder calculateExpress = new StringBuilder();
            for (int i = 0; i < formulaNumber.Count; i++)
            {
                calculateExpress.Append(formulaNumber[i].ToString().Trim());
                if (i < operatorChars.Count)
                {
                    calculateExpress.Append(operatorChars[i].ToString().Trim());
                }


            }

            DataTable dt = new DataTable();
            //如果值为0,则无法转换成decimal类型
            if (dt.Compute(calculateExpress.ToString(), "").ToString() == "0")
            {
                return 0;
            }
            else
            {
                return (decimal)dt.Compute(calculateExpress.ToString(), "");
            }

            #endregion





        }
View Code
原文地址:https://www.cnblogs.com/windy3417/p/14534386.html