コード例 #1
0
        //'=SY("6301")-SY("1221")
        decimal CalcFormula(int lineNo, string formula)
        {
            if (string.IsNullOrEmpty(formula))
            {
                return(0);
            }
            if (!formula.StartsWith("="))
            {
                return(0);
            }

            List <string> lstMethod = CommonUtils.MatchPattern(formula, "(SY|C|SJY|SL)");

            if (lstMethod.Count == 0)
            {
                return(0);
            }

            List <string> lstParams  = CommonUtils.MatchPattern(formula, "(?<=\")[^\"^(^)]*(?=\")");
            List <string> lstOpratio = CommonUtils.MatchPattern(formula, "(\\+|\\-|\\*|/)");

            if (lstMethod.Count != lstParams.Count)
            {
                throw new FinanceException(FinanceResult.IMPERFECT_DATA, "公式错误");
            }

            decimal result = 0M;

            for (int i = 0; i < lstMethod.Count; i++)
            {
                var param = lstParams[i];
                var ids   = SampleCalculator.GetAccountSubjectIds(m_lstAso, param);
                if (ids.Count == 0)
                {
                    continue;
                }
                var method = lstMethod[i];
                var amount = CalcMethod(method, ids);
                if (i > 0)
                {
                    result = SampleCalculator.CalcOpration(result, lstOpratio[i - 1], amount);
                }
                else
                {
                    result = amount;
                }
            }

            logger.Debug("CalcFormula : [{0}]{1}{2}", lineNo, result, formula);
            return(result);
        }
コード例 #2
0
        string Calc(string formula)
        {
            if (string.IsNullOrEmpty(formula))
            {
                return("");
            }
            if (!formula.StartsWith("="))
            {
                return(formula);
            }

            List <string> lstMethod  = CommonUtils.MatchPattern(formula, "(Y|C|JY|DC|DY)");
            List <string> lstParams  = CommonUtils.MatchPattern(formula, "(?<=\")[^\"^(^)]*(?=\")");
            List <string> lstOpratio = CommonUtils.MatchPattern(formula, "(\\+|\\-|\\*|/)");

            if (lstMethod.Count != lstParams.Count)
            {
                throw new FinanceException(FinanceResult.IMPERFECT_DATA, "公式错误");
            }
            if (lstMethod.Count != lstOpratio.Count + 1)
            {
                throw new FinanceException(FinanceResult.IMPERFECT_DATA, "公式错误");
            }

            decimal result = 0M;

            for (int i = 0; i < lstMethod.Count; i++)
            {
                var param = lstParams[i];
                var ids   = SampleCalculator.GetAccountSubjectIds(m_lstAso, param);
                if (ids.Count == 0)
                {
                    continue;
                }
                var method = lstMethod[i];
                var amount = CalcMethod(method, ids);
                if (i > 0)
                {
                    result = SampleCalculator.CalcOpration(result, lstOpratio[i - 1], amount);
                }
                else
                {
                    result = amount;
                }
            }
            return(result.ToString("0.00"));
        }