Evaluation d'une formule dans une chaine ex:"2+9*51-25/5"

Contenu du snippet

Cette fonction recoit en paramètre une chaine contenant une formule de math simple (4 opérateurs).. du type : "2+9*51-25/5", et renvoie le résultat (ici 456)...
Pour faire ca, j'isole chaque sous-partie (Nombre, Separateur, Nombre), je la calcule, et la ré-insère dans la formule une fois calulée... puis au suivant.. tant qu'il y a un separateur...

Source / Exemple :


Public Function Evaluate(Formule As String) As Double

    Dim PosCour, PosSep, PosAV, PosAP, Av, Ap, Res
    Dim Separateurs(3), NumSep, Formule2
    
    'liste des separateurs
    
    Separateurs(0) = "/"
    Separateurs(1) = "*"
    Separateurs(2) = "+"
    Separateurs(3) = "-"

    For NumSep = 0 To 3
        
        PosSep = InStr(1, Formule, Separateurs(NumSep))
        While PosSep > 0
            'on determine le nombre AVANT le separateur
            PosCour = PosSep - 1
            While (IsNumeric(Mid(Formule, PosCour, 1)))
                PosCour = PosCour - 1
                If PosCour = 0 Then GoTo suite:
            Wend
suite:
            PosAV = PosCour + 1
            Av = Mid(Formule, PosAV, PosSep - PosAV)
            'on determine le nombre APRES le separateur
            PosCour = PosSep + 1
            While IsNumeric(Mid(Formule, PosCour, 1))
                PosCour = PosCour + 1
            Wend
            PosAP = PosCour
            Ap = Mid(Formule, PosSep + 1, PosAP - PosSep - 1)
            
            'On calcule la sous-partie isolée
            Select Case NumSep
                Case 0: '/
                    Res = Val(Av) / Val(Ap)
                Case 1: '*
                    Res = Val(Av) * Val(Ap)
                Case 2:  '+
                    Res = Val(Av) + Val(Ap)
                Case 3:  '-
                    Res = Val(Av) - Val(Ap)
            End Select
            
            'on réécrit la formule avec la sous-partie calculée
            Formule = Left(Formule, PosAV - 1) & Trim(Str(Res)) & Mid(Formule, PosAP)
            PosSep = InStr(1, Formule, Separateurs(NumSep))
        Wend
    Next
    Evaluate = Val(Formule)
End Function

Conclusion :


Bon, le code est pas parfait, loin de là, mais c'est l'algo qui compte non... ;)
N'hésitez pas a m'insulter parceque je gère pas les erreurs, j'utilise un goto, et parce que je gère pas les parenthèses aussi...
m'enfin voilà koi... si vous pouvez le completer, n'hezitez pas...
Merci à DoDoDODo ;p

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.