求个公式解析源码

dreamagainzwj 2009-09-05 04:14:58
求个公式解析源码
只需要支持 + - * / () ,不需要支持函数。用于工资的计算的。


...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lijgknspt 2012-10-22
  • 打赏
  • 举报
回复
antlr可以解析
winner2050 2009-09-05
  • 打赏
  • 举报
回复
using System;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.VisualBasic;
using System.Reflection;

namespace TopWinCMS.Common.Userdefined
{
/// <summary>
/// 自定义公式
/// </summary>
/// <remarks>调用例子 double a = (double)Evaluator.Eval("sin(0.2) + 5");</remarks>
public class Evaluator
{
private static CodeDomProvider comp = new VBCodeProvider();
private static CompilerParameters cp = new CompilerParameters();
private static MethodInfo mi;

/// <summary>
/// 执行公式
/// </summary>
/// <param name="expression">公式</param>
/// <returns></returns>
/// <remarks>调用例子 double a = (double)Evaluator.Eval("sin(0.2) + 5");</remarks>
public static object Eval(string expression)
{
StringBuilder codeBuilder = new StringBuilder();

codeBuilder.AppendLine("Imports System");
codeBuilder.AppendLine("Imports System.Math");
codeBuilder.AppendLine("Imports Microsoft.VisualBasic");
codeBuilder.AppendLine();
codeBuilder.AppendLine("Public Module Mode");
codeBuilder.AppendLine(" Public Function Func() As Object");
codeBuilder.AppendLine(" Return " + expression);
codeBuilder.AppendLine(" End Function");
codeBuilder.AppendLine("End Module");

cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("Microsoft.VisualBasic.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;

string code = codeBuilder.ToString();
CompilerResults cr = comp.CompileAssemblyFromSource(cp, code);

if (cr.Errors.HasErrors)
{
return null;
}
else
{
Assembly a = cr.CompiledAssembly;
Type t = a.GetType("Mode");

mi = t.GetMethod("Func", BindingFlags.Static | BindingFlags.Public);


return mi.Invoke(null, new object[0]);
}
}

}
}

常用的数学计算全部OK
wuyq11 2009-09-05
  • 打赏
  • 举报
回复
DataTable.Compute()方法說明如下
计算用来传递筛选条件的当前行上的给定表达式。
Object Compute (string expression,string filter)
string expression="(1.5+2.5)*2/4";
参考
aimeast 2009-09-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zgke 的回复:]
DataTable _Talbe = new DataTable();

            string _Value = new DataTable().Compute("1+1+1*9+(1+1)", "").ToString();
[/Quote]
这是个方法

这个问题已经有过讨论了,有很多方法,结果看这里
http://topic.csdn.net/u/20090701/22/f985c795-66d0-4567-8882-48de3964c428.html
悔说话的哑巴 2009-09-05
  • 打赏
  • 举报
回复
zgke 就可以了
zgke 2009-09-05
  • 打赏
  • 举报
回复
DataTable _Talbe = new DataTable();

string _Value = new DataTable().Compute("1+1+1*9+(1+1)", "").ToString();
llsen 2009-09-05
  • 打赏
  • 举报
回复
到底要什么?

公式?

解析源码?

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧