您的位置:首页 > 其它

计算任意一个数学运算表达式字符串的值

2013-12-03 15:34 405 查看
题:写一个方法计算任意一个数学运算表达式字符串,不区分优先级

例:
"9+8*2"=34
"2-8*9+3"=-51
"2*2*2*2*2"=32
"0"=0

//===========================代码 Begin==============================

    /// <summary>
    /// 传入一个数学运算的表达示字符串不区分优级计算返回其结果
    /// </summary>
    protected string ComputeMathStr(string exStr)
    {
        //去除空字符
        exStr = Regex.Replace(exStr.Trim(), " *", "");

        //匹配字符串是否是以两个数的操作开头
        Match ma = Regex.Match(exStr, @"^(\-?\d+)([\+\-\*\/])(\d+)");

        if (ma.Success)//匹配成功,计算
        {
            string firstStr = ma.Groups[0].Value.ToString();//获取匹配的字符串:如2+3

            int num1 = int.Parse(ma.Groups[1].Value.ToString());//第一个数值
            string opr = ma.Groups[2].Value.ToString();//操作符
            int num2 = int.Parse(ma.Groups[3].Value.ToString());//第二个数值

            string newStr = exStr.Substring(firstStr.Length);//获取后面剩余的字符串
            return ComputeMathStr(GetResultByOperator(opr, num1, num2) + newStr);//递归运算其结果,直到不能匹配为止
        }
        else//匹配失败,直接返回结果
        {
            return exStr;
        }
    }

    /// <summary>
    /// 根据操作符计算两个数的值并返回结果
    /// </summary>
    protected int GetResultByOperator(string opr,int num1,int num2)
    {  
        switch (opr)
        {
            case "+":
                return num1 + num2;
            case "-":
                return num1 - num2;
            case "*":
                return num1 * num2;
            case "/":
                if (num2 == 0)
                {
                    throw new Exception("尝试除以零!");
                }
                return num1 / num2;
            default:
                return 0;
        }
   
    }
//===========================代码 End==================================
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: