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