/// <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 }