Results 1 to 4 of 4

Thread: Real Dynamic Calculate Class

  1. #1

    Thread Starter
    Addicted Member Programmation's Avatar
    Join Date
    Nov 2009
    Posts
    161

    Real Dynamic Calculate Class

    Hello all,

    The Class Library below, Enable you to execute all of your math function statements (Priority for parentheses then what out of parentheses order by Power, Multiply, Divide, Subtract, Add) Dynamically in just one process.

    Class:
    PHP Code:
    'About Author: 
    '
    NameProgrammation(OmarNegm), 
    'Country: Egypt, 
    '
    E_mailProgrammation2000@hotmail.com
    Imports System
    Imports System
    .Text
    Public Class clsCalculate
        
    Const addMark As Char "+"
        
    Const powerMark As Char "^"
        
    Const divideMark As Char "/"
        
    Const percentMark As Char "%"
        
    Const multiplyMark As Char "*"
        
    Const subtractMark As Char "_"
        
    Const leftParenttheses As Char ")"
        
    Const rightParenttheses As Char "("
        
    Dim UserPassedStatement As String ""
        
    Dim CalculateMathStatement As String ""
        
    Dim AllParentThesesStatements As StringBuilder = New StringBuilder
        
    Public Function RealDynamicCalculate(ByVal MathStatement As StringOptional ByRef strLogs As String "") As Double
            Dim Logs
    () As String
            Dim Result 
    As Double 0.0
            Dim CheckParenttheses 
    As String ""
            
    Try
                
    UserPassedStatement RemoveSpaces(MathStatement)
                
    AllParentThesesStatements.Append(UserPassedStatement)
                
    CalculateMathStatement RemoveSpaces(MathStatement)
                
    CheckParenttheses IsValidParentthesesFormat(CalculateMathStatement)
                If 
    Not CheckParenttheses.Trim "" Then
                    MessageBox
    .Show("Math Statement You'r Typed Expected a " CheckParenttheses"Error"MessageBoxButtons.OKMessageBoxIcon.Exclamation)
                    Return 
    0
                End 
    If
                
    CalculateMathStatement HandlNegativeMark(CalculateMathStatement)
                
    Call GetAllParentThesesStatements()
                
    CalculateMathStatement HandlNegativeMark(CalculateMathStatement)
                
    CalculateMathStatement Calculate(CalculateMathStatementFalse)
                
    Result Convert.ToDouble(CalculateMathStatement)
                
    AllParentThesesStatements.Append("|")
                
    AllParentThesesStatements.Append(LenUserPassedStatementToSpaces(UserPassedStatement.Length))
                
    AllParentThesesStatements.Append("=")
                
    AllParentThesesStatements.Append(Result)
                
    Logs Split(AllParentThesesStatements.ToString"|")
                
    strLogs ""
                
    For As Integer 0 To UBound(Logs)
                    If 
    strLogs.Trim "" Then
                        strLogs 
    Logs(i)
                    Else
                        
    strLogs &= vbNewLine Logs(i)
                    
    End If
                
    Next
            
    Catch ex As Exception
                MessageBox
    .Show("Math Statement is Incorrect Format!""Error"MessageBoxButtons.OKMessageBoxIcon.Exclamation)
                
    Result 0
            End 
    Try
            Return 
    Result
        End 
    Function
        Private Function 
    HandlNegativeMark(ByVal strMath As String)
            
    Dim Negative As Char "-"
            
    Dim currentChat As Char ""
            
    Dim Result As String strMath
    ReDo
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(Resulti1)) = Negative Then
                    
    If 1 Then
                        
    If IsNumeric(Mid(Result11)) = True Or Convert.ToChar(Mid(Result11)) = leftParenttheses Then
                            Result 
    Result.Remove(11)
                            
    Result Result.Insert(1subtractMark)
                            GoTo 
    ReDo
                        End 
    If
                    
    End If
                
    End If
            
    Next
            
    Return Result
        End 
    Function
        Private Function 
    RemoveSpaces(ByVal strMath As String) As String
            Dim Space 
    As Char " "
            
    Dim Result As String strMath
    ReDo
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(ResultI1)) = Space Then
                    Result 
    Result.Remove(11)
                    GoTo 
    ReDo
                End 
    If
            
    Next
            
    Return Result
        End 
    Function
        Private Function 
    LNumberLength(ByVal Start As IntegerByVal strString As String) As Integer
            Dim I 
    As Integer 0
            Dim Result 
    As Integer 0
            
    For Start To strString.Length
                
    If IsNumeric(Mid(strStringI1)) = True Or Convert.ToChar(Mid(strStringI1)) = "-" Or Convert.ToChar(Mid(strStringI1)) = "." Then
                    Result 
    += 1
                
    Else
                    Exit For
                
    End If
            
    Next
            
    If Result 0 Then Result 1
            
    Return Result
        End 
    Function
        Private Function 
    RNumberLength(ByVal Start As IntegerByVal strString As String) As Integer
            Dim Result 
    As Integer 0
            Dim I 
    As Integer Start
            
    Do Until I 1
                I 
    -= 1
                
    If IsNumeric(Mid(strStringI1)) = True Or Convert.ToChar(Mid(strStringI1)) = "-" Or Convert.ToChar(Mid(strStringI1)) = "." Then
                    Result 
    += 1
                
    Else
                    Exit Do
                
    End If
            
    Loop
            
    If Result 0 Then Result 1
            
    Return Result
        End 
    Function
        Private Function 
    FilterAllToAddProcess(ByVal strMath As String) As String
            Dim Result 
    As String strMath        
            Dim dblCalculate 
    As Double 0
            Dim RighLength 
    As Integer 0
            Dim LeftLength 
    As Integer 0
    ReDo
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(ResultI1)) = percentMark Then
                    RighLength 
    RNumberLength(IResult)      
                    
    dblCalculate Convert.ToDouble(Mid(ResultRighLengthRighLength)) / 100
                    Result 
    Result.Insert(RighLength 1Convert.ToString(dblCalculate))
                    
    Result Result.Remove(Val(RighLength 1) + Convert.ToString(dblCalculate).LengthRighLength 1)
                    GoTo 
    ReDo
                End 
    If
            
    Next
    ReDo1
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(ResultI1)) = powerMark Then
                    RighLength 
    RNumberLength(IResult)
                    
    LeftLength LNumberLength(1Result)
                    
    dblCalculate Convert.ToDouble(Mid(ResultRighLengthRighLength)) ^ Convert.ToDouble(Mid(Result1LeftLength))
                    
    Result Result.Insert(RighLength 1Convert.ToString(dblCalculate))
                    
    Result Result.Remove(Val(RighLength 1) + Convert.ToString(dblCalculate).LengthRighLength LeftLength 1)
                    GoTo 
    ReDo1
                End 
    If
            
    Next
    RoDo2
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(ResultI1)) = multiplyMark Then
                    RighLength 
    RNumberLength(IResult)
                    
    LeftLength LNumberLength(1Result)
                    
    dblCalculate Convert.ToDouble(Mid(ResultRighLengthRighLength)) * Convert.ToDouble(Mid(Result1LeftLength))
                    
    Result Result.Insert(RighLength 1Convert.ToString(dblCalculate))
                    
    Result Result.Remove(Val(RighLength 1) + Convert.ToString(dblCalculate).LengthRighLength LeftLength 1)
                    GoTo 
    RoDo2
                End 
    If            
            
    Next
    ReDo3
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(ResultI1)) = divideMark Then
                    RighLength 
    RNumberLength(IResult)
                    
    LeftLength LNumberLength(1Result)
                    
    dblCalculate Convert.ToDouble(Mid(ResultRighLengthRighLength)) / Convert.ToDouble(Mid(Result1LeftLength))
                    
    Result Result.Insert(RighLength 1Convert.ToString(dblCalculate))
                    
    Result Result.Remove(Val(RighLength 1) + Convert.ToString(dblCalculate).LengthRighLength LeftLength 1)
                    GoTo 
    ReDo3
                End 
    If
            
    Next

    ReDo4
    :
            For 
    As Integer 1 To Result.Length
                
    If Convert.ToChar(Mid(ResultI1)) = subtractMark Then
                    RighLength 
    RNumberLength(IResult)
                    
    LeftLength LNumberLength(1Result)                                
                    
    dblCalculate Convert.ToDouble(Mid(ResultRighLengthRighLength)) - Convert.ToDouble(Mid(Result1LeftLength))
                    
    Result Result.Insert(RighLength 1Convert.ToString(dblCalculate))
                    
    Result Result.Remove(Val(RighLength 1) + Convert.ToString(dblCalculate).LengthRighLength LeftLength 1)
                    GoTo 
    ReDo4
                End 
    If
            
    Next
            
    Return Result
        End 
    Function
        Private Function 
    Calculate(ByVal strMath As StringByVal Have_A_Parentheses As Boolean) As Double
            Dim Result 
    As Double 0
            
    If Have_A_Parentheses True Then
                strMath 
    strMath.Remove(01)
                
    strMath strMath.Remove(strMath.Length 11)
            
    End If
            
    strMath FilterAllToAddProcess(strMath)
            If 
    strMath.Length And IsNumeric(strMath) = True Then
                Result 
    CDbl(strMath)
            ElseIf 
    IsNumeric(strMath) = True Then
                Result 
    CDbl(strMath)
                GoTo 
    SinglValue
            
    Else            
                For 
    As Integer 1 To strMath.Length
                    Select 
    Case Convert.ToChar(Mid(strMathi1))
                        Case 
    addMark
                            
    If Result 0 Then
                                
    If Have_A_Parentheses False Then
                                    
    If AllParentThesesStatements.ToString "" Then
                                        AllParentThesesStatements
    .Append(Convert.ToDouble(Mid(strMathRNumberLength(istrMath), RNumberLength(istrMath))) & "+" Convert.ToDouble(Mid(strMath1LNumberLength(1strMath))))
                                    Else
                                        
    AllParentThesesStatements.Append("|")
                                        
    AllParentThesesStatements.Append(Convert.ToDouble(Mid(strMathRNumberLength(istrMath), RNumberLength(istrMath))) & "+" Convert.ToDouble(Mid(strMath1LNumberLength(1strMath))))
                                    
    End If
                                
    End If
                                
    Result Convert.ToDouble(Mid(strMathRNumberLength(istrMath), RNumberLength(istrMath))) + Convert.ToDouble(Mid(strMath1LNumberLength(1strMath)))
                                
    LNumberLength(1strMath)
                            Else
                                If 
    Have_A_Parentheses False Then
                                    
    If AllParentThesesStatements.ToString "" Then
                                        AllParentThesesStatements
    .Append(Result "+" Convert.ToDouble(Mid(strMath1LNumberLength(1strMath))))
                                    Else
                                        
    AllParentThesesStatements.Append("|")
                                        
    AllParentThesesStatements.Append(Result "+" Convert.ToDouble(Mid(strMath1LNumberLength(1strMath))))
                                    
    End If
                                
    End If
                                
    Result Result Convert.ToDouble(Mid(strMath1LNumberLength(1strMath)))
                                
    LNumberLength(1strMath)
                            
    End If
                    
    End Select
                Next
            End 
    If
    SinglValue:
            Return 
    Result
        End 
    Function       
        Private 
    Sub GetAllParentThesesStatements()
            
    Dim cmsLength As Integer 0
            Dim FirstRightOne 
    As Integer 0
            Dim SourceParenttheses 
    As String ""
            
    Dim CalculatedPatrenttheses As Double 0
    ReDo
    :
            Do 
    Until GetFirstRightParenttheses(CalculateMathStatement) = 0
                cmsLength 
    CalculateMathStatement.Length
                FirstRightOne 
    GetFirstRightParenttheses(CalculateMathStatement)
                For 
    As Integer FirstRightOne To cmsLength
                    
    If Convert.ToChar(Mid(CalculateMathStatementi1)) = leftParenttheses Then
                        SourceParenttheses 
    Mid(CalculateMathStatementFirstRightOneVal(FirstRightOne) + 1)
                        
    CalculatedPatrenttheses Calculate(SourceParentthesesTrue)
                        If 
    AllParentThesesStatements.ToString.Trim "" Then
                            AllParentThesesStatements
    .Append(SourceParenttheses "=" CalculatedPatrenttheses)
                        Else
                            
    AllParentThesesStatements.Append("|")
                            
    AllParentThesesStatements.Append(SourceParenttheses "=" CalculatedPatrenttheses)
                        
    End If
                        
    CalculateMathStatement CalculateMathStatement.Insert(FirstRightOne 1Convert.ToString(CalculatedPatrenttheses))
                        
    CalculateMathStatement CalculateMathStatement.Remove(Val(FirstRightOne 1) + Val(Convert.ToString(CalculatedPatrenttheses).Length), Val(FirstRightOne) + 1)
                        GoTo 
    ReDo
                    End 
    If
                
    Next
            Loop    
        End Sub    
        
    Private Function GetFirstRightParenttheses(ByVal MathStatement As String) As Integer
            Dim Result 
    As Integer 0
            Dim msLength 
    As Integer MathStatement.Length
            
    For As Integer 1 To MathStatement.Length
                
    If Convert.ToChar(Mid(MathStatementi1)) = rightParenttheses Then
                    Result 
    i
                End 
    If
            
    Next
            
    Return Result        
        End 
    Function
        Private Function 
    LenUserPassedStatementToSpaces(ByVal LenUserStatement As Integer) As String
            Dim Result 
    As String ""
            
    For As Integer 0 To LenUserStatement
                Result 
    &= " "
            
    Next
            
    Return Result
        End 
    Function
        Private Function 
    IsValidParentthesesFormat(ByVal strMath As String) As String
            Dim Result 
    As String ""
            
    Dim Left As Integer 0
            Dim Right 
    As Integer 0
            
    For As Integer 1 To strMath.Length
                Select 
    Case Convert.ToChar(Mid(strMathI1))
                    Case 
    leftParenttheses
                        Left 
    += 1
                    
    Case rightParenttheses
                        Right 
    += 1
                End Select
            Next
            
    If Left Right Then
                Result 
    ""
            
    Else
                If 
    Left Right Then
                    Result 
    "Right Patrentheses '('"
                
    Else
                    
    Result "Left Patrentheses ')'"
                
    End If
            
    End If
            Return 
    Result
        End 
    Function
    End Class 
    The examples in the next post.
    Just Do It!

  2. #2

    Thread Starter
    Addicted Member Programmation's Avatar
    Join Date
    Nov 2009
    Posts
    161

    Re: Real Dynamic Calculate Class

    This class have a just one function "RealDynamicCalculate" declared using Public declaration type this function do every thing and the others functions and subs its for filtering and calculate passed Math String.
    This function have a just tow parameters the first one "MathStatement" is named parameter and string type, require the math statment string. the second one is optional reference parameter use it if you wana retuen the logs of all class processes on your Math Statment in a string variable or TextBox.

    Examples:

    1
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("(100+100)-(100/100)"
    'Result = 199 
    OR

    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("(100+100)-(100%)"
    'Result = 199 
    2
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("5^2*(24/2-2)"
    'Result = 250 
    3
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("5^2*24/2"
    'Result = 300 
    4
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("90000-((5^2*24/2)^2)"
    'Result = 0 
    5
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("90000-((5^2*24/2)^2)+(90000/2)"
    'Result = 45000 
    6
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("((((90000-((5^2*24/2)^2)+(90000/2)))))-22500"
    'Result = 22500 
    7
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("(1-1+((12*12) + (23-(-12)))-12+15*(2^3)+(70%)*(100)/2-(22))-200"txtLogs.Text
    'Result = 100 
    8
    PHP Code:
    Dim Calculator As New clsCalculate 
    txtResult
    .Text Calculator.RealDynamicCalculate("((-500)-(-200))"
    'Result = -300 
    Hope that helps you.
    Please try it and comment here if you want.
    Thanks.
    Just Do It!

  3. #3
    Stack Overflow mod​erator
    Join Date
    May 2008
    Location
    British Columbia, Canada
    Posts
    2,824

    Re: Real Dynamic Calculate Class

    Good job! A suggestion: don't capitalize "Theses" in your various "ParenTheses" methods - "parentheses" is one word and it's a bit confusing.

  4. #4

    Thread Starter
    Addicted Member Programmation's Avatar
    Join Date
    Nov 2009
    Posts
    161

    Re: Real Dynamic Calculate Class

    Quote Originally Posted by minitech View Post
    Good job! A suggestion: don't capitalize "Theses" in your various "ParenTheses" methods - "parentheses" is one word and it's a bit confusing.
    Good suggestion, Thanks for your comment minitech
    Just Do It!

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width