问题描述
怎样解析带有函数的字符串比如:abs(abs(1)+2*(1+3))
解决方案
解决方案二:
你想要什么结果?
解决方案三:
引用楼主libo19872011的回复:
怎样解析带有函数的字符串比如:abs(abs(1)+2*(1+3))
用c#动态编译吧。。
解决方案四:
我实在datatable上进行操作的。就是在列之间进行的运算。比如:第二列值=abs(第一列)+2*(第二列值)之类的
解决方案五:
楼主搞编译原理吗?
解决方案六:
不是的啊,不知道这样功能怎样实现啊
解决方案七:
引用5楼libo19872011的回复:
不是的啊,不知道这样功能怎样实现啊
DataTable列表达式计算:有abs函数,表达式不支持abs函数///<summary>///采用DataTable的Columns属性的Expression属性计算表达式结果///</summary>//如下结构的数据表://A1A2A3A4A5A6//51223459087//567845325697//解析以下四个表达式://<1>A6=A1*1.5-A2//<2>A6=(A1+A2+A3+A4+A5)/5+SUM(A4)+AVG(A2)//<3>A6=IIF(A1>A2,A1+A2,A1-A2)//<4>A6=IIF(MAX(A1)>100ANDMIN(A3)>10,'0','1')privatevoidCalcExpressions(stringstrEx){//this.m_dt=>DataTable//this.m_bs=>BindingSourceif(strEx!=null&&strEx.Trim().Length>0){//按照"="拆解字符串intnIndex=strEx.IndexOf("=");if(nIndex!=-1){//计算表达式,并立即改写DataTable数据this.m_dt.Columns[strEx.Substring(0,nIndex).Trim()].Expression=strEx.Substring(nIndex+1,strEx.Length-nIndex-1).Trim();//修改数据后,强制UI刷新数据this.m_bs.ResetBindings(false);}}}
这个如何:C#的动态编译,并返回结果///<summary>///采用动态编译,计算表达式的结果///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidbutton6_Click(objectsender,EventArgse){//声明要计算C#代码,要求必须完整的C#代码stringstrCode=@"usingSystem;namespaceParseEx{publicclassParseExC{publicstaticdoubleGetValue(){return1+5*8-(Math.Sin(12)*2.5);}}}";CodeDomProvidercomp=newCSharpCodeProvider();CompilerParameterscp=newCompilerParameters();StringBuildercodeBuilder=newStringBuilder();codeBuilder.AppendLine(strCode);cp.ReferencedAssemblies.Add("System.dll");cp.GenerateExecutable=false;cp.GenerateInMemory=true;CompilerResultscr=comp.CompileAssemblyFromSource(cp,codeBuilder.ToString());if(cr.Errors.HasErrors){MessageBox.Show("Error!");}else{Assemblya=cr.CompiledAssembly;if(a!=null){Typet=a.GetType("ParseEx.ParseExC");if(t!=null){//因为是静态调用,不需要创建实例了//objectmode=a.CreateInstance("Mode");MethodInfomi=t.GetMethod("GetValue",BindingFlags.Static|BindingFlags.Public);if(mi!=null){doubled=(double)mi.Invoke(null,null);MessageBox.Show(d.ToString());}}}}}
解决方案八:
花了点时间弄好的。不过现在不打算开源。类似于excel中的函数。
解决方案九:
toisjoe这个怎样发图片啊我的问题想给你截图说明
解决方案十:
toisjoe怎样发图片啊,我的问题想通过我的截图给你说明啊
解决方案十一:
引用8楼libo19872011的回复:
toisjoe这个怎样发图片啊我的问题想给你截图说明
听说需要在博客中把图传上去,然后把地址拷贝到这里来。
解决方案十二:
toisjoe怎样发图片啊,我的问题想通过截图给你说明。
解决方案十三:
toisjoehttp://writeblog.csdn.net/PostList.aspx
解决方案十四:
toisjoe[img=http://writeblog.csdn.net/PostList.aspx][/img]
解决方案十五:
http://www.cnblogs.com/michaelhuwei/archive/2008/03/26/1123401.html早就开源了,支持函数的解析
解决方案:
引用14楼huwei001982的回复:
http://www.cnblogs.com/michaelhuwei/archive/2008/03/26/1123401.html早就开源了,支持函数的解析
这个就不错,挺适合你的
解决方案:
我的函数不光是数学函数还有一些其他函数,例如球字符串的长度:Length("我们是");之类的if(char.IsDigit(c)){ProcDigit(refi,refstrExpression);}else//其它的字符全当成函数{ProcFunc(refi,refstrExpression);}break;他把参数值也当成函数啊
解决方案:
他那个可以扩充。我写的是用在一个项目上。功能支持函数嵌套。循环。返回object对象。参数也可以是object对象。支持一切c#写的函数。不过函数重载还在考虑加不加上。那个有点影响效率。这个只是那个项目很小的一部分。暂时没开算开源。将来不打算混淆。不开源,不免费,不混淆。
解决方案:
引用16楼libo19872011的回复:
我的函数不光是数学函数还有一些其他函数,例如球字符串的长度:Length("我们是");之类的if(char.IsDigit(c)){ProcDigit(refi,refstrExpression);}else//其它的字符全当成函数{ProcFunc(refi,refstrExpression);}brea……
看看我给你的C#动态编译吧,比较适合,稍微改改就可以了
解决方案:
toisjoe如果我想调用string类里面的函数这块怎写?usingSystem;namespaceParseEx{publicclassParseExC{publicstaticdoubleGetValue(){return1+5*8-(Math.Sin(12)*2.5);}}}";
解决方案:
return1+5*8-(Math.Sin(12)*2.5);
只要你写的语句符合C#语法,就可以通过并返回结果
解决方案:
我刚才看了看http://www.cnblogs.com/michaelhuwei/archive/2008/03/26/1123401.html里面写的计算表达式的代码,稍加修改就可以支持Length("我们是")这样的函数。
解决方案:
toisjoe不知道怎样写参数是字符串类的函数,希望你指点。我的qq476155749.想要获得你更多的指点。