计算任意一个数学运算表达式字符串的值
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==================================
例:
"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==================================
相关文章推荐
- 正则表达式 获取字符串内提取图片URL字符串
- 单例模式示
- js 树插件
- su认证失败
- java_ant详解(转载)
- 如何修改鼠标右键设置
- poj 1961 Period KMP
- 创建 XXXXXXXX 的配置节处理程序时出错: 请求失败
- Flex基础知识
- VS2010 ReportViewer导出文件下载保存不能识别文件类型
- Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)
- 免费iOS第三方推送工具Urban Airship使用教程
- HDU3113(工科数学分析之分解)
- ibm websphere portal8.0 url 跳转保持当前语言环境配置
- Redirect 原理
- pajek 指标计算
- MySQL表分区的使用
- 最长上升子序列(Longest Increasing Subsequence)
- magento cron 配置
- 用Nmap工具查找Downadup/Conficker的蠕虫病毒源