一个字符串的问题 string str = "2+3-5*10"; 怎么根据str得到-45这个值? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 int result = Convert.ToInt32(new DataTable().Compute(str,"")); string str = (2+3-5*10).ToString; 最简单的方法:DataTable dt=new DataTable();object o = dt.Compute("2+3-5*10", null); 似乎需要写一个string型表达式的计算方法/// <summary> /// 算术逆波兰表达式计算. /// </summary> /// <param name="s"></param> /// <returns></returns> public static string ComputeRPN(string s) { string S=BuildingRPN(s); string tmp=""; System.Collections.Stack sk=new System.Collections.Stack(); char c=' '; System.Text.StringBuilder Operand=new System.Text.StringBuilder(); double x,y; for(int i=0;i<S.Length;i++) { c=S[i]; if(char.IsDigit(c)||c=='.') {//数据值收集. Operand.Append(c); } else if(c==' '&&Operand.Length>0) { #region 运算数转换 try { tmp=Operand.ToString(); if(tmp.StartsWith("-"))//负数的转换一定要小心...它不被直接支持. {//现在我的算法里这个分支可能永远不会被执行. sk.Push(-((double)Convert.ToDouble(tmp.Substring(1,tmp.Length-1)))); } else { sk.Push(Convert.ToDouble(tmp)); } } catch { return "发现异常数据值."; } Operand=new System.Text.StringBuilder(); #endregion } else if(c=='+'//运算符处理.双目运算处理. ||c=='-' ||c=='*' ||c=='/' ||c=='%' ||c=='^') { #region 双目运算 if(sk.Count>0)/*如果输入的表达式根本没有包含运算符.或是根本就是空串.这里的逻辑就有意义了.*/ { y=(double)sk.Pop(); } else { sk.Push(0); break; } if(sk.Count>0) x=(double)sk.Pop(); else { sk.Push(y); break; } switch(c) { case '+': sk.Push(x+y); break; case '-': sk.Push(x-y); break; case '*': sk.Push(x*y); break; case '/': sk.Push(x/y); break; case '%': sk.Push(x%y); break; case '^':// if(x>0)// {我原本还想,如果被计算的数是负数,又要开真分数次方时如何处理的问题.后来我想还是算了吧. sk.Push(System.Math.Pow(x,y));// }// else// {// double t=y;// string ts="";// t=1/(2*t);// ts=t.ToString();// if(ts.ToUpper().LastIndexOf('E')>0)// {// ;// }// } break; } #endregion } else if(c=='!')//单目取反.) { sk.Push(-((double)sk.Pop())); } } if(sk.Count>1) return "运算没有完成."; if(sk.Count==0) return "结果丢失.."; return sk.Pop().ToString(); }这个可以代码参考下 int result = Convert.ToInt32(new DataTable().Compute(str, null)); http://www.codeproject.com/KB/cs/runtime_eval.aspx c# winform combobox如何使光标选取列表中第一项 但输入框内不会自动输入选项内容 怎么在datagridview的右键菜单的方法里获取datagridview所选中的行 这道面试题目究竟该选择什么? 急急急急..... 在线等待..... 一个C#中简单的问题? 求教,javascript按钮点击后,执行ASP.net按钮,急[谢谢] 如何替换成等长字符串?急。。。。。 c# 传值 如何将一段字符串文本发送到asp页面不是ASP.NET 请教C#中的接口 帮助将下面代码转成C# C#登录验证 我往textbox中添加数据库中读取的数据出错了!高手给指导一下 c# 实现弹出窗口
int result = Convert.ToInt32(new DataTable().Compute(str,""));
object o = dt.Compute("2+3-5*10", null);
/// 算术逆波兰表达式计算.
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ComputeRPN(string s)
{
string S=BuildingRPN(s);
string tmp="";
System.Collections.Stack sk=new System.Collections.Stack();
char c=' ';
System.Text.StringBuilder Operand=new System.Text.StringBuilder();
double x,y;
for(int i=0;i<S.Length;i++)
{
c=S[i];
if(char.IsDigit(c)||c=='.')
{//数据值收集.
Operand.Append(c);
}
else if(c==' '&&Operand.Length>0)
{
#region 运算数转换
try
{
tmp=Operand.ToString();
if(tmp.StartsWith("-"))//负数的转换一定要小心...它不被直接支持.
{//现在我的算法里这个分支可能永远不会被执行.
sk.Push(-((double)Convert.ToDouble(tmp.Substring(1,tmp.Length-1))));
}
else
{
sk.Push(Convert.ToDouble(tmp));
}
}
catch
{
return "发现异常数据值.";
}
Operand=new System.Text.StringBuilder();
#endregion
}
else if(c=='+'//运算符处理.双目运算处理.
||c=='-'
||c=='*'
||c=='/'
||c=='%'
||c=='^')
{
#region 双目运算
if(sk.Count>0)/*如果输入的表达式根本没有包含运算符.或是根本就是空串.这里的逻辑就有意义了.*/
{
y=(double)sk.Pop();
}
else
{
sk.Push(0);
break;
}
if(sk.Count>0)
x=(double)sk.Pop();
else
{
sk.Push(y);
break;
}
switch(c)
{
case '+':
sk.Push(x+y);
break;
case '-':
sk.Push(x-y);
break;
case '*':
sk.Push(x*y);
break;
case '/':
sk.Push(x/y);
break;
case '%':
sk.Push(x%y);
break;
case '^':
// if(x>0)
// {我原本还想,如果被计算的数是负数,又要开真分数次方时如何处理的问题.后来我想还是算了吧.
sk.Push(System.Math.Pow(x,y));
// }
// else
// {
// double t=y;
// string ts="";
// t=1/(2*t);
// ts=t.ToString();
// if(ts.ToUpper().LastIndexOf('E')>0)
// {
// ;
// }
// }
break;
}
#endregion
}
else if(c=='!')//单目取反.)
{
sk.Push(-((double)sk.Pop()));
}
}
if(sk.Count>1)
return "运算没有完成.";
if(sk.Count==0)
return "结果丢失..";
return sk.Pop().ToString();
}
这个可以代码参考下