//在引用中添加com中的microsoft script control 1.0 using MSScriptControl;MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass(); sc.Language = "javascript"; Response.Write (sc.Eval("6+9-9*8").ToString());
谢谢大家的帮忙 首先谢谢3楼的方法 我一开始是找到了引用 但是不会用 谢谢了 现在会用了DataTable 那个方法是我喜欢的 现成的要比我自己写的那个有效率吧? 我想应该是这样的 因为我还是初学者 写的垃圾了很多谢谢5楼的逻辑 看你的逻辑之前 我已经自己常识着写出了一套可以计算字符串表达试的方法了 一会我会把代码粘上 大家分享下 顺便哪里有不好的 希望大家指教一下下面是我自己用2005写的一个控制台应用程序 简单的实现了一下 大家帮忙指点一下 using System; using System.Collections.Generic; using System.Text; using System.Collections;namespace MakeString { class Program { static void Main(string[] args) { System.Console.WriteLine("请输入要计算的字符串"); string str = System.Console.ReadLine(); make(str); } public static void make(string str) { do { int one = 0; int oneend = 0; int biao = 0; foreach (char c in str) { if (c == '(') { one = biao; } if (c == ')') { oneend = biao; } biao++; if (oneend != 0) { break; } } if (one == 0 || oneend == 0) { break; } str=str.Replace(str.Substring(one, oneend - one+1),doEach(str.Substring(one + 1, oneend - one-1))); } while (true); Console.WriteLine("结果是:{0}",doEach(str)); } public static string doEach(string st) { ArrayList num = new ArrayList(); ArrayList fh = new ArrayList(); int begin = 0; foreach (char c in st) { if (c == '+') { num.Add(double.Parse(st.Substring(begin, st.IndexOf('+')))); st = st.Remove(begin, st.IndexOf('+')); fh.Add(st.Substring(begin, 1)); st = st.Remove(begin, 1); } else if (c == '-') { num.Add(double.Parse(st.Substring(begin, st.IndexOf('-')))); st = st.Remove(begin, st.IndexOf('-')); fh.Add(st.Substring(begin, 1)); st = st.Remove(begin, 1); } else if (c == '*') { num.Add(double.Parse(st.Substring(begin, st.IndexOf('*')))); st = st.Remove(begin, st.IndexOf('*')); fh.Add(st.Substring(begin, 1)); st = st.Remove(begin, 1); } else if (c == '/') { num.Add(double.Parse(st.Substring(begin, st.IndexOf('/')))); st = st.Remove(begin, st.IndexOf('/')); fh.Add(st.Substring(begin, 1)); st = st.Remove(begin, 1); } else if (c == '%') { num.Add(double.Parse(st.Substring(begin, st.IndexOf('%')))); st = st.Remove(begin, st.IndexOf('%')); fh.Add(st.Substring(begin, 1)); st = st.Remove(begin, 1); } } num.Add(double.Parse(st.Substring(begin, st.Length))); do { for (int i = 0; i < fh.Count; i++) { if (fh[i].ToString() == "*") { num[i] = double.Parse(num[i].ToString()) * double.Parse(num[i + 1].ToString()); num.Remove(num[i + 1]); fh.Remove(fh[i]); } else if (fh[i].ToString() == "/") { num[i] = double.Parse(num[i].ToString()) / double.Parse(num[i + 1].ToString()); num.Remove(num[i + 1]); fh.Remove(fh[i]); } else if (fh[i].ToString() == "%") { num[i] = double.Parse(num[i].ToString()) % double.Parse(num[i + 1].ToString()); num.Remove(num[i + 1]); fh.Remove(fh[i]); } if (fh.Count == 0) { break; } } for (int i = 0; i < fh.Count; i++) { if (fh[i].ToString() == "+") { num[i] = double.Parse(num[i].ToString()) + double.Parse(num[i + 1].ToString()); num.Remove(num[i + 1]); fh.Remove(fh[i]); } else if (fh[i].ToString() == "-") { num[i] = double.Parse(num[i].ToString()) - double.Parse(num[i + 1].ToString()); num.Remove(num[i + 1]); fh.Remove(fh[i]); } } if (fh.Count == 0) { break; } } while (true);
http://dev.csdn.net/develop/article/59/59512.shtm
//先在项目中添加COM引用Microsoft Script Control 1.0
using MSScriptControl;ScriptControl vScriptControl = new ScriptControl();
vScriptControl.Language = "JavaScript";
Text = vScriptControl.Eval("'Zswang 路过' + (1 + 2)").ToString();
public static object Eval(string AExpression)
{
try
{
return new DataTable().Compute(AExpression, "");
}
catch
{
return null;
}
}
http://www.codeproject.com/KB/dotnet/Expr.aspx
带括号的计算(表达式)
{
if(有括号)
{
带括号的计算(表达式.replace(最外层括号内容,带括号的计算(最外层括号内容)))
}
else
{
不带括号的计算(表达式)
}
}不带括号的计算(表达式)
{
if(有乘除)
{
不带括号的计算(表达式.replace(乘除号及两侧的数,乘除法(乘除号及两侧的数)))
}
else
{
依次做加减法
}
}乘除法(表达式)
{
左边的数 乘或除 右边的数
}以上是递归版本,非递归的版本可以参考数据结构的逆波兰表达式。
{ string className = "Calc"; string methodName = "Run"; expression = expression.Replace("/", "*1.0/"); // 创建编译器实例。 ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler()); // 设置编译参数。 CompilerParameters paras = new CompilerParameters(); paras.GenerateExecutable = false; paras.GenerateInMemory = true;
// 创建动态代码。 StringBuilder classSource = new StringBuilder(); classSource.Append("public class " + className + "\n"); classSource.Append("{\n"); classSource.Append(" public object " + methodName + "()\n"); classSource.Append(" {\n"); classSource.Append(" return " + expression + ";\n"); classSource.Append(" }\n"); classSource.Append("}"); //System.Diagnostics.Debug.WriteLine(classSource.ToString()); // 编译代码。 CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString()); // 获取编译后的程序集。 Assembly assembly = result.CompiledAssembly; // 动态调用方法。 object eval = assembly.CreateInstance(className); MethodInfo method = eval.GetType().GetMethod(methodName); object reobj = method.Invoke(eval, null); GC.Collect(); return reobj; }
//=============================//使用Method:
int intValue = (int)Eval(“3*5+8”);
涉及技術方面: 動態編譯程序集
程序集動態生成Instance
Reflection機制
sc.Language = "javascript";
Response.Write (sc.Eval("6+9-9*8").ToString());
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;namespace MakeString
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine("请输入要计算的字符串");
string str = System.Console.ReadLine();
make(str);
} public static void make(string str)
{
do
{
int one = 0;
int oneend = 0;
int biao = 0;
foreach (char c in str)
{
if (c == '(')
{
one = biao;
}
if (c == ')')
{
oneend = biao;
}
biao++;
if (oneend != 0)
{
break;
}
}
if (one == 0 || oneend == 0)
{
break;
}
str=str.Replace(str.Substring(one, oneend - one+1),doEach(str.Substring(one + 1, oneend - one-1)));
} while (true);
Console.WriteLine("结果是:{0}",doEach(str));
}
public static string doEach(string st)
{
ArrayList num = new ArrayList();
ArrayList fh = new ArrayList();
int begin = 0;
foreach (char c in st)
{ if (c == '+')
{
num.Add(double.Parse(st.Substring(begin, st.IndexOf('+'))));
st = st.Remove(begin, st.IndexOf('+'));
fh.Add(st.Substring(begin, 1));
st = st.Remove(begin, 1);
}
else if (c == '-')
{
num.Add(double.Parse(st.Substring(begin, st.IndexOf('-'))));
st = st.Remove(begin, st.IndexOf('-'));
fh.Add(st.Substring(begin, 1));
st = st.Remove(begin, 1);
}
else if (c == '*')
{
num.Add(double.Parse(st.Substring(begin, st.IndexOf('*'))));
st = st.Remove(begin, st.IndexOf('*'));
fh.Add(st.Substring(begin, 1));
st = st.Remove(begin, 1);
}
else if (c == '/')
{
num.Add(double.Parse(st.Substring(begin, st.IndexOf('/'))));
st = st.Remove(begin, st.IndexOf('/'));
fh.Add(st.Substring(begin, 1));
st = st.Remove(begin, 1);
}
else if (c == '%')
{
num.Add(double.Parse(st.Substring(begin, st.IndexOf('%'))));
st = st.Remove(begin, st.IndexOf('%'));
fh.Add(st.Substring(begin, 1));
st = st.Remove(begin, 1);
}
}
num.Add(double.Parse(st.Substring(begin, st.Length)));
do
{
for (int i = 0; i < fh.Count; i++)
{
if (fh[i].ToString() == "*")
{
num[i] = double.Parse(num[i].ToString()) * double.Parse(num[i + 1].ToString());
num.Remove(num[i + 1]);
fh.Remove(fh[i]);
}
else if (fh[i].ToString() == "/")
{
num[i] = double.Parse(num[i].ToString()) / double.Parse(num[i + 1].ToString());
num.Remove(num[i + 1]);
fh.Remove(fh[i]);
}
else if (fh[i].ToString() == "%")
{
num[i] = double.Parse(num[i].ToString()) % double.Parse(num[i + 1].ToString());
num.Remove(num[i + 1]);
fh.Remove(fh[i]);
}
if (fh.Count == 0)
{
break;
}
}
for (int i = 0; i < fh.Count; i++)
{
if (fh[i].ToString() == "+")
{
num[i] = double.Parse(num[i].ToString()) + double.Parse(num[i + 1].ToString());
num.Remove(num[i + 1]);
fh.Remove(fh[i]);
}
else if (fh[i].ToString() == "-")
{
num[i] = double.Parse(num[i].ToString()) - double.Parse(num[i + 1].ToString());
num.Remove(num[i + 1]);
fh.Remove(fh[i]);
}
}
if (fh.Count == 0)
{
break;
}
} while (true);
return num[0].ToString();
}
}
}