# textbox input ( 5* 2 ) + (5 * (2 + 3)) - 2 + 3, should get answer 36

textbox input ( 5* 2 ) + (5 * (2 + 3)) - 2 + 3, should get answer 36.

how to do it

Jini
LVL 10
###### Who is Participating?

Commented:
Here you go. i use it in an  sales commision calculator i built.

'***************** USAGE *************
Msgbox EvaluateExpression(txtBox.text)
'*************************************

'************* MODULE CODE *****************
' Evaluate the expression.
Public Function EvaluateExpression(ByVal expression As String) As Double
Const PREC_NONE = 11
Const PREC_UNARY = 10   ' Not actually used.
Const PREC_POWER = 9
Const PREC_TIMES = 8
Const PREC_DIV = 7
Const PREC_INT_DIV = 6
Const PREC_MOD = 5
Const PREC_PLUS = 4

Dim expr As String
Dim is_unary As Boolean
Dim next_unary As Boolean
Dim parens As Integer
Dim pos As Integer
Dim expr_len As Integer
Dim ch As String
Dim lexpr As String
Dim rexpr As String
Dim Value As String
Dim status As Long
Dim best_pos As Integer
Dim best_prec As Integer

' Remove all spaces.
expr = Replace\$(expression, " ", "")
expr_len = Len(expr)
If expr_len = 0 Then
EvaluateExpression = 0
Exit Function
End If

' If we find + or - now, it is a unary operator.
is_unary = True

' So far we have nothing.
best_prec = PREC_NONE

' Find the operator with the lowest precedence.
' Look for places where there are no open
' parentheses.
For pos = 1 To expr_len
' Examine the next character.
ch = Mid\$(expr, pos, 1)

' Assume we will not find an operator. In
' that case, the next operator will not
' be unary.
next_unary = False

If ch = " " Then
' Just skip spaces. We keep them here
' to make the error messages easier to
ElseIf ch = "(" Then
' Increase the open parentheses count.
parens = parens + 1

' A + or - after "(" is unary.
next_unary = True
ElseIf ch = ")" Then
' Decrease the open parentheses count.
parens = parens - 1

' An operator after ")" is not unary.
next_unary = False

' If parens < 0, too many ')'s.
If parens < 0 Then
Err.Raise vbObjectError + 1001, _
"EvaluateExpression", _
"Too many )s in '" & _
expression & "'"
End If
ElseIf parens = 0 Then
' See if this is an operator.
If ch = "^" Or ch = "*" Or _
ch = "/" Or ch = "\" Or _
ch = "%" Or ch = "+" Or _
ch = "-" _
Then
' An operator after an operator
' is unary.
next_unary = True

' See if this operator has higher
' precedence than the current one.
Select Case ch
Case "^"
If best_prec >= PREC_POWER Then
best_prec = PREC_POWER
best_pos = pos
End If

Case "*", "/"
If best_prec >= PREC_TIMES Then
best_prec = PREC_TIMES
best_pos = pos
End If

Case "\"
If best_prec >= PREC_INT_DIV Then
best_prec = PREC_INT_DIV
best_pos = pos
End If

Case "%"
If best_prec >= PREC_MOD Then
best_prec = PREC_MOD
best_pos = pos
End If

Case "+", "-"
' Ignore unary operators
' for now.
If (Not is_unary) And _
best_prec >= PREC_PLUS _
Then
best_prec = PREC_PLUS
best_pos = pos
End If
End Select
End If
End If
is_unary = next_unary
Next pos

' If the parentheses count is not zero,
' there's a ')' missing.
If parens <> 0 Then
Err.Raise vbObjectError + 1002, _
"EvaluateExpression", "Missing ) in '" & _
expression & "'"
End If

' Hopefully we have the operator.
If best_prec < PREC_NONE Then
lexpr = Left\$(expr, best_pos - 1)
rexpr = Mid\$(expr, best_pos + 1)
Select Case Mid\$(expr, best_pos, 1)
Case "^"
EvaluateExpression = _
EvaluateExpression(lexpr) ^ _
EvaluateExpression(rexpr)
Case "*"
EvaluateExpression = _
EvaluateExpression(lexpr) * _
EvaluateExpression(rexpr)
Case "/"
EvaluateExpression = _
EvaluateExpression(lexpr) / _
EvaluateExpression(rexpr)
Case "\"
EvaluateExpression = _
EvaluateExpression(lexpr) \ _
EvaluateExpression(rexpr)
Case "%"
EvaluateExpression = _
EvaluateExpression(lexpr) Mod _
EvaluateExpression(rexpr)
Case "+"
EvaluateExpression = _
EvaluateExpression(lexpr) + _
EvaluateExpression(rexpr)
Case "-"
EvaluateExpression = _
EvaluateExpression(lexpr) - _
EvaluateExpression(rexpr)
End Select
Exit Function
End If

' If we do not yet have an operator, there
' are several possibilities:
'
' 1. expr is (expr2) for some expr2.
' 2. expr is -expr2 or +expr2 for some expr2.
' 3. expr is Fun(expr2) for a function Fun.
' 4. expr is a primitive.
' 5. It's a literal like "3.14159".

' Look for (expr2).
If Left\$(expr, 1) = "(" And Right\$(expr, 1) = ")" Then
' Remove the parentheses.
EvaluateExpression = EvaluateExpression( _
Mid\$(expr, 2, expr_len - 2))
Exit Function
End If

' Look for -expr2.
If Left\$(expr, 1) = "-" Then
EvaluateExpression = -EvaluateExpression( _
Mid\$(expr, 2))
Exit Function
End If

' Look for +expr2.
If Left\$(expr, 1) = "+" Then
EvaluateExpression = EvaluateExpression( _
Mid\$(expr, 2))
Exit Function
End If

' Look for Fun(expr2).
If expr_len > 5 And Right\$(expr, 1) = ")" Then
' Find the first (.
pos = InStr(expr, "(")

If pos > 0 Then
' See what the function is.
lexpr = LCase\$(Left\$(expr, pos - 1))
rexpr = Mid\$(expr, pos + 1, expr_len - pos - 1)
Select Case lexpr
Case "sin"
EvaluateExpression = Sin(EvaluateExpression(rexpr))
Exit Function
Case "cos"
EvaluateExpression = Cos(EvaluateExpression(rexpr))
Exit Function
Case "tan"
EvaluateExpression = Tan(EvaluateExpression(rexpr))
Exit Function
Case "sqr"
EvaluateExpression = Sqr(EvaluateExpression(rexpr))
Exit Function
Case "factorial"
EvaluateExpression = Factorial(EvaluateExpression(rexpr))
Exit Function
' program-defined functions) here.
End Select
End If
End If

' It must be a literal like "2.71828".
On Error Resume Next
EvaluateExpression = CDbl(expr)
status = Err.Number
On Error GoTo 0
If status <> 0 Then
Err.Raise status, _
"EvaluateExpression", _
"Error evaluating '" & expression & _
"' as a constant."
End If
End Function
' Return the factorial of the expression.
Private Function Factorial(ByVal Value As Double) As Double
Dim result As Double

' Make sure the value is an integer.
If CLng(Value) <> Value Then
Err.Raise vbObjectError + 1001, _
"Factorial", _
"Argument must be an integer in Factorial(" & _
Format\$(Value) & ")"
End If

result = 1
Do While Value > 1
result = result * Value
Value = Value - 1
Loop
Factorial = result
End Function

0

Billing EngineerCommented:
0

Senior .Net DeveloperAuthor Commented:
no not through script control
0

Billing EngineerCommented:
why not? does the job!
0

Senior .Net DeveloperAuthor Commented:
not possible
0

Billing EngineerCommented:
WHY not possible?
WHY reinvent the wheel?
0

Senior .Net DeveloperAuthor Commented:
no time to do
0

Senior .Net DeveloperAuthor Commented:
i want the vb function code
0

Billing EngineerCommented:
>no time to do

well, using the vb script control is done in 10 seconds, just check the reference in the project references, put a script control on the form, and use it's eval function.
there will be no faster than that...
0

Commented:
Would doing

Eval(txtBox.Value)

bring it up?

txtBox holds your maths  ( 5* 2 ) + (5 * (2 + 3)) - 2 + 3

0

Commented:
that a huge code ha?
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.