公式字符串转换为公式或结果
方法一:DataColumn.Expression & DataTable.Compute方法(不支持函数)
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站建设、做网站、卓资网络推广、重庆小程序开发、卓资网络营销、卓资企业策划、卓资品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供卓资建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com
DataColumn.Expression:
Dim objData As New DataTable objData.Columns.Add("a", Type.GetType(Integer)) objData.Columns.Add("b", Type.GetType(Integer)) objData.Columns.Add("c", Type.GetType(Integer)) Dim objCol As DataColumn = _ objData.Columns.Add("x", Type.GetType(Integer)) objCol.Expression = "a+b*c-2" Dim objRow As DataRow = DataTable.NewRow() objRow("a") = 2 objRow("b") = 3 objRow("c") = 4 objData.Rows.Add(objRow) Console.WriteLine(objData.Rows(0)("x"))
DataTable.Compute:
MessageBox.Show((new DataTable()).Compute("1+2*3/4", "").ToString())
方法二:SQL的方式
方法三:解析
Imports System.Text.RegularExpressions Public Class Evaluate Shared ReadOnly m_instance As New Evaluate() '''''' 构造函数 ''' '''Shared Sub New() End Sub ''' ''' 获取实例 ''' '''''' ''' Public Shared ReadOnly Property Instance() As Evaluate Get Return m_instance End Get End Property ' A number is a sequence of digits optionally followed by a dot and ' another sequence of digits. The number in parenthesis in order to ' define an unnamed group. Private Const Num As String = "(\-?\d+\.?\d*)" ' List of 1-operand functions. Private Const Func1 As String = "(exp|log|log10|abs|sqr|sqrt|sin|cos|tan|asin|acos|atan)" ' List of 2-operand functions. Private Const Func2 As String = "(atan2)" ' List of N-operand functions. Private Const FuncN As String = "(min|max)" ' List of predefined constants. Private Const Constants As String = "(e|pi)" Function Eval(ByVal expr As String) As Double ' Define one Regex object for each supported operation. ' They are outside the loop, so that they are compiled only once. ' Binary operations are defined as two numbers with a symbol between them ' optionally separated by spaces. Dim rePower As New Regex(Num & "\s*(\^)\s*" & Num) Dim reAddSub As New Regex(Num & "\s*([-+])\s*" & Num) Dim reMulDiv As New Regex(Num & "\s*([*/])\s*" & Num) ' These Regex objects resolve call to functions. (Case insensitivity.) Dim reFunc1 As New Regex(Func1 & "\(\s*" & Num & "\s*\)", _ RegexOptions.IgnoreCase) Dim reFunc2 As New Regex(Func2 & "\(\s*" & Num & "\s*,\s*" & Num _ & "\s*\)", RegexOptions.IgnoreCase) Dim reFuncN As New Regex(FuncN & "\((\s*" & Num & "\s*,)+\s*" & Num _ & "\s*\)", RegexOptions.IgnoreCase) ' This Regex object drop a + when it follows an operator. Dim reSign1 As New Regex("([-+/*^])\s*\+") ' This Regex object converts a double minus into a plus. Dim reSign2 As New Regex("\-\s*\-") ' This Regex object drops parenthesis around a number. ' (must not be preceded by an alphanum char (it might be a function name) Dim rePar As New Regex("(? "" ' Get the argument, replace any comma to space, and convert to double. args.Add(CDbl(m.Groups(i).Value.Replace(","c, " "c))) i += 1 Loop Dim str As String = "" ' function name is 1st group. Select Case m.Groups(1).Value.ToUpper Case "MIN" args.Sort() str = args(0).ToString Case "MAX" args.Sort() str = args(args.Count - 1).ToString End Select Return str End Function End Class
方法四:
http://www.codeproject.com/vb/net/expression_evaluator.asp
参考资料:http://blog.csdn.net/fangxinggood/article/details/5992661
分享标题:公式字符串转换为公式或结果
URL标题:http://scyanting.com/article/ijddde.html