在jb中像Eval一样在vb.net中进行数学运算

Cyc*_*one 3 vb.net eval

有没有办法解析vb.net中的字符串(比如,内置方法),可以像Eval一样进行数学运算吗?例如,3 +(7/3.5)作为字符串将返回2.

我不是要求你为我编写代码,我只是想知道是否有内置的方法来执行此操作,如果没有,我将自己编写代码.

我可以打赌它不能自己解析像Sin(90)这样的东西,我明白需要用Math.Sin(90)代替它.

如果有内置方法,你如何使用它?

Ahm*_*eed 13

通过使用DataTable.Compute方法,有限(即简单)数学表达式的快捷方式.显然,这不是很强大(功能有限),并且为了这个目的而滥用DataTable感觉很不自在,但我想我会添加到当前的答案中.

例:

var result = new DataTable().Compute("3+(7/3.5)", null); // 5
Run Code Online (Sandbox Code Playgroud)

"罪(90)"不适用于这种方法.有关受支持函数的列表,请参阅DataColumn.Expression属性页,特别是在"Aggregates"部分下.

使用System.CodeDom命名空间是一个选项.

一些有用的链接:


编辑:为了解决您的评论,这里有一种方法来演示用等效的Math类方法替换三角函数.

C#

string expression = "(Sin(0) + Cos(0)+Tan(0)) * 10";
string updatedExpression = Regex.Replace(expression, @"(?<func>Sin|Cos|Tan)\((?<arg>.*?)\)", match =>
            match.Groups["func"].Value == "Sin" ? Math.Sin(Int32.Parse(match.Groups["arg"].Value)).ToString() :
            match.Groups["func"].Value == "Cos" ? Math.Cos(Int32.Parse(match.Groups["arg"].Value)).ToString() :
            Math.Tan(Int32.Parse(match.Groups["arg"].Value)).ToString()
        );
var result = new DataTable().Compute(updatedExpression, null); // 10
Run Code Online (Sandbox Code Playgroud)

VB.NET

Dim expression As String = "(Sin(0) + Cos(0)+Tan(0)) * 10"
Dim updatedExpression As String = Regex.Replace(expression, "(?<func>Sin|Cos|Tan)\((?<arg>.*?)\)", Function(match As Match) _
        If(match.Groups("func").Value = "Sin", Math.Sin(Int32.Parse(match.Groups("arg").Value)).ToString(), _
        If(match.Groups("func").Value = "Cos", Math.Cos(Int32.Parse(match.Groups("arg").Value)).ToString(), _
        Math.Tan(Int32.Parse(match.Groups("arg").Value)).ToString())) _
        )
Dim result = New DataTable().Compute(updatedExpression, Nothing)
Run Code Online (Sandbox Code Playgroud)

但请注意,您需要知道"arg"组的内容.我知道它们是整数,所以我在它们上面使用了Int32.Parse.如果它们是项目的组合,那么这种简单的方法将不起作用.我怀疑如果问题变得太复杂以及更多不受支持的函数调用,你将不断需要对解决方案进行创可贴,在这种情况下,CodeDom方法或其他方法可能更合适.