加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

C#字符串转计算公式

(2011-05-04 12:31:07)
标签:

c

sharp

字符串

计算

公式

it

分类: C#笔记

    目前我有个需求,要求取得给定字符串计算后的数值。如:“20+3*5-10/2.5”将返回——31   
    表达式中可能出现的运算符号包括   +   -   ×    
    暂不考虑括号及符号还有其它特殊运算符,但会有小数

        private const char EndChar = ';';
        private const char Inter_Minus = '#';//内部负号  
        private const char FlagChar = '$';
        private static readonly char[] InvalidChars = new char[] { EndChar, Inter_Minus, FlagChar };
        private static readonly char[] Symbols = new char[] { '*', '/', '+', '-', '(', ')' };
        private static readonly char[] Symbols_Simple = new char[] { '*', '/', '+', '-', EndChar };

        public static double EvaluateSimpleexpression_r(string expression)
        {
            double result = 0;//结果  
            double data = 0;//中间结果  
            string dataStr;
            char opera, topopera;
            int index;
            ArrayList NS = new ArrayList();     //数栈  
            ArrayList OS = new ArrayList();     //运算符栈  

            expression += EndChar;
            if (expression[0] == '-' || expression[0] == '+')
                expression = "0" + expression;

            while ((index = expression.IndexOfAny(Symbols_Simple)) != -1)
            {
                if (index != 0)     //数据  
                {
                    try
                    {
                        dataStr = expression.Substring(0, index);
                        if (dataStr[0] == Inter_Minus) dataStr = "-" + dataStr.Remove(0, 1);
                        data = double.Parse(dataStr);
                        NS.Add(data);
                        expression = expression.Substring(index, expression.Length - index);
                    }
                    catch (Exception ec)
                    {
                        throw new Exception("表达式中有不能识别的字符。", ec);
                    }
                }
                else   //运算符  
                {
                    try
                    {
                        opera = expression[index];
                        if (OS.Count == 0)
                        {
                            if (opera == EndChar)
                                result = (double)NS[NS.Count - 1];
                            else
                                OS.Add(opera);
                        }
                        else
                        {
                            topopera = (char)OS[OS.Count - 1];
                            while ((topopera == '*' || topopera == '/') ||
                            ((topopera == '+' || topopera == '-') && (opera != '*' && opera != '/')) ||
                            (opera == EndChar && topopera != FlagChar))
                            //当前运算符优先级低于栈顶运算符优先级  
                            {
                                switch (topopera)
                                {
                                    case '+':
                                        data = (double)NS[NS.Count - 2] + (double)NS[NS.Count - 1];
                                        break;
                                    case '-':
                                        data = (double)NS[NS.Count - 2] - (double)NS[NS.Count - 1];
                                        break;
                                    case '*':
                                        data = (double)NS[NS.Count - 2] * (double)NS[NS.Count - 1];
                                        break;
                                    case '/':
                                        data = (double)NS[NS.Count - 2] / (double)NS[NS.Count - 1];
                                        break;
                                }
                                NS.RemoveAt(NS.Count - 1);
                                NS.RemoveAt(NS.Count - 1);
                                NS.Add(data);
                                OS.RemoveAt(OS.Count - 1);
                                if (OS.Count == 0)
                                    topopera = FlagChar;
                                else
                                    topopera = (char)OS[OS.Count - 1];
                            }
                            if (opera == EndChar)
                            {
                                result = (double)NS[NS.Count - 1];
                            }
                            else
                            {
                                OS.Add(opera);
                            }
                        }
                        expression = expression.Substring(index + 1, expression.Length - index - 1);
                    }
                    catch (Exception ec)
                    {
                        throw new Exception("非法的表达式。", ec);
                    }
                }
            }
            return result;
        }

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有