C# 字符串函数计算

仅供参考:

#region 字符串函数计算
        /// <summary>
        /// 字符串函数运算
        /// 格式1:@函数名(参数1,参数2...)
        /// 格式2:@函数名(参数1,参数2...)+@函数名(参数1,参数2...)-@函数名(参数1,参数2...)....
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private decimal StringToFunction(string str)
        {
            decimal result = 0;

            //是否带有运算符
            if (Regex.IsMatch(str, @"[+|-|*|/]"))
            {
                //替换所有运算符,方便分析函数(参数)
                var newstr = Regex.Replace(str, @"[+|-|*|/]", "(*_*)");
                //函数结果容器
                List<decimal> list_decimal = new List<decimal>();
                foreach (string hs in newstr.Split(new string[] { "(*_*)" }, StringSplitOptions.None).ToList())
                {
                    var dec = GetData(hs);
                    list_decimal.Add(dec);
                }

                //运算符
                var matches = Regex.Matches(str, @"[+|-|*|/]");
                for (int de = 0; de < list_decimal.Count; de++)
                {
                    if (de == 0)
                    {
                        result += list_decimal[de];
                    }
                    else
                    {
                        switch (matches[de - 1].Value)
                        {
                            case "+": result += list_decimal[de]; break;
                            case "-": result -= list_decimal[de]; break;
                            case "*": result *= list_decimal[de]; break;
                            case @"/": result /= list_decimal[de]; break;
                        }
                    }
                }
            }
            else //不带运算符
            {
                result = GetData(str);
            }
            return result;
        }
        /// <summary>
        /// 数据获取
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        private decimal GetData(string str)
        {
            decimal result = 0;
            //解析函数
            var modelFunction = GetFunction(str);

            switch (modelFunction.funname.ToLower())
            {
                case "xj_je":

                    break;
                case "jqy":
                    //result = JQY(modelFunction.parameter);
                    break;
                case "-jqy":
                    //result = JQY(modelFunction.parameter);
                    break;
                case "nc":
                    result = NC(modelFunction.parameter);
                    break;
                case "ye":
                    result = YE(modelFunction.parameter);
                    break;
            }
            return result;
        }
        #endregion



        /// <summary>
        /// 获取函数名
        /// </summary>
        /// <param name="str">字符串</param>
        /// <returns></returns>
        private ModelFunction GetFunction(string str)
        {
            string funname = Regex.Replace(str, @"@|((.+))", "");
            List<string> parameter = new List<string>();
            var p = Regex.Matches(str, @"d+");
            for (int i = 0; i < p.Count; i++)
            {
                parameter.Add(p[i].Value);
            }
            ModelFunction model = new ModelFunction()
            {
                funname = funname,
                parameter = parameter
            };
            return model;
        }

        private class ModelFunction
        {
            /// <summary>
            /// 函数名称
            /// </summary>
            public string funname { get; set; }
            /// <summary>
            /// 参数
            /// </summary>
            public List<string> parameter { get; set; }
        }
原文地址:https://www.cnblogs.com/OleRookie/p/8441905.html