OVH Cloud OVH Cloud

expression mathématique

7 réponses
Avatar
Michel Lemaitre
bonjour,
J'ai une expression du type "(400/360)" que je stoque dans lestring
"MonTexte". Je veux récupérer le résultat de l'opération dans ledecimal
"MaValeur", mais je ne vois pas comment faire.
Meci de votre aide

7 réponses

Avatar
Patrick Philippot
Michel Lemaitre wrote:
bonjour,
J'ai une expression du type "(400/360)" que je stocke dans le string
"MonTexte". Je veux récupérer le résultat de l'opération dans
le décimal "MaValeur", mais je ne vois pas comment faire.



Bonjour,

Il n'y a pas dans la bibliothèque .Net d'équivalent à la fonction Eval
de Javascript. Ce que vous demandez n'est pas possible directement à
moins de s'écrire un petit parseur d'évaluation d'expression (il est
assez facile de trouver du code source, .Net ou non .Net).

Il y a néanmoins une possibilité, peu orthodoxe, en appelant du code
Javascript .Net. Ce qui suit n'est qu'une démonstration des possibilités
inter-langages de .Net et ne fonctionne que si l'expression est exprimée
en termes Javascript.

1) Créez un fichier nommé CustomEval.js (Fichier | Nouveau | Fichier |
Script) comme suit:

// Code source JScript
class CustomEval
{
static function eval(strExp)
{
return eval(strExp);
}
}

2) Compilez ce code sur la ligne de commande (console .Net) :

jsc /t:library CustomEval.js

ce qui devrait produire CustomEval.dll

3) Référencez cet assemblage dans votre programme VB .Net ou C# ainsi
que l'assemblage Microsoft.JScript.

4) Utilisez la méthode CustomEval.eval comme suit (la méthode est
static, vous n'avez donc pas besoin d'instancier un objet de la classe
CustomEval).

result = CustomEval.eval("2+3")


JE REPETE: ceci est du bricolage :-))

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Patrick Philippot wrote:
Ce que vous demandez n'est pas possible directement à
moins de s'écrire un petit parseur d'évaluation d'expression (il est
assez facile de trouver du code source, .Net ou non .Net).



Quelques exemples (freeware ou commerciaux):

http://www.codeproject.com/csharp/runtime_eval.asp
http://www.unisoftplus.com/uspexpress/
http://www.adersoftware.com/index.cfm?page=compilers
http://www.thecodeproject.com/csharp/compiledsymexpr.asp
http://www.bestcode.com/html/bcparser_net.html
http://digilander.libero.it/foxes/mathparser/MathExpressionsParser.htm

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
David Bouchard
Essaye ceci, ¸


Ajoute dans tes référence com, microsoft script control 1.0 et ensuite,
utilise se code.

Dim Calculateur As New MSScriptControl.ScriptControl

Calculateur.Language = "vbscript"

Reponse = Calculateur.Eval(FormuleString)

David



"Patrick Philippot" a écrit dans le message
de news:
Patrick Philippot wrote:
Ce que vous demandez n'est pas possible directement à
moins de s'écrire un petit parseur d'évaluation d'expression (il est
assez facile de trouver du code source, .Net ou non .Net).



Quelques exemples (freeware ou commerciaux):

http://www.codeproject.com/csharp/runtime_eval.asp
http://www.unisoftplus.com/uspexpress/
http://www.adersoftware.com/index.cfm?page=compilers
http://www.thecodeproject.com/csharp/compiledsymexpr.asp
http://www.bestcode.com/html/bcparser_net.html
http://digilander.libero.it/foxes/mathparser/MathExpressionsParser.htm

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Pas de Spam
il me semble que vous chercher compliquer utilise simplement VAL

val("ta string")

attention si tu as des virgules ou point il faudrat peut etre utiliser pour
ne pas perdre les chiffre apres la virgule
val("ta string".replace(",","."))



"Michel Lemaitre" a écrit dans le message de
news:
bonjour,
J'ai une expression du type "(400/360)" que je stoque dans lestring
"MonTexte". Je veux récupérer le résultat de l'opération dans ledecimal
"MaValeur", mais je ne vois pas comment faire.
Meci de votre aide




Avatar
Patrick Philippot
Bonjour,

Pas de Spam wrote:
il me semble que vous chercher compliquer utilise simplement VAL

val("ta string")



Ah, grand débat... Cette fonction n'est disponible qu'au travers du
namespace Microsoft.VisualBasic. Elle ne fait pas partie de la
bibliothèque .Net. J'aurais effectivement dû la mentionner mais je suis
un adepte de la programmation .Net "orthodoxe". Ce namespace n'est là
que pour servir de passerelle vers des mécanismes spécifiques à VB. Il
n'y a rien dedans qui ne puisse se traiter par des classes de la FCL
(sauf peut-être Val, mon erreur).

Il n'est absolument pas obligatoire de référencer cet assemblage pour
programmer en VB .Net. Il l'est par défaut mais je ne suis pas sûr que
ce soit une bonne idée car cela n'encourage ni à utiliser les mécanismes
typiquement .Net, ni à programmer vraiment objet.

Question de choix personnel et stratégique et dans le cas présent, il
est vrai que cela résout le problème posé. Mais je continue de ne pas
recommander son utilisation.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
c2i-Richard Clark [MVP]
Moi aussi j'étais dans ton approche. Je disais même:

Pour déclarer un Integer faites:
Dim i as System.Int32
plutot que
Dim i as Integer

(idem en C# d'ailleurs)

Seulement, aussi bizarre que cela puisse paraitre, certaines fonctions
implémentées dans MS.VB.dll sont plus rapides que celles du framework.
De plus, elles effectuent des vérifs qui sont importantes auxquelles ont
n'aurait pas pensé naturellement.

Concretement maintenant, je n'ai plus d'opinion tranchée (bien que je
recommande tjs de passer plutot par les implémentations dans le framework de
base que MS.VB.dll).

NB: ne pas confondre MS.VB.dll et MS.VB.Compatibility.dll. Cette dernière
étant à proscrire.

--
Richard Clark
http://www.c2i.fr - Le portail .NET
[Microsoft MVP .NET]
______________________________________________
'Au coeur de VB .NET' (MS Press, 430 pages, 34 euros)
http://www.amazon.fr/exec/obidos/ASIN/2100065645/c2ifrleportad-21
______________________________________________

"Patrick Philippot" wrote in message
news:
Bonjour,

Pas de Spam wrote:
> il me semble que vous chercher compliquer utilise simplement VAL
>
> val("ta string")

Ah, grand débat... Cette fonction n'est disponible qu'au travers du
namespace Microsoft.VisualBasic. Elle ne fait pas partie de la
bibliothèque .Net. J'aurais effectivement dû la mentionner mais je suis
un adepte de la programmation .Net "orthodoxe". Ce namespace n'est là
que pour servir de passerelle vers des mécanismes spécifiques à VB. Il
n'y a rien dedans qui ne puisse se traiter par des classes de la FCL
(sauf peut-être Val, mon erreur).

Il n'est absolument pas obligatoire de référencer cet assemblage pour
programmer en VB .Net. Il l'est par défaut mais je ne suis pas sûr que
ce soit une bonne idée car cela n'encourage ni à utiliser les mécanismes
typiquement .Net, ni à programmer vraiment objet.

Question de choix personnel et stratégique et dans le cas présent, il
est vrai que cela résout le problème posé. Mais je continue de ne pas
recommander son utilisation.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr




Avatar
Patrick Philippot
c2i-Richard Clark [MVP] wrote:
Concretement maintenant, je n'ai plus d'opinion tranchée (bien que je
recommande tjs de passer plutot par les implémentations dans le
framework de base que MS.VB.dll).



Salut Richard,

Tu as raison. Je me garde bien d'être trop puriste. Dans le cas présent,
si c'est la seule solution et que l'utilisateur ne veut pas s'embêter
avec un parseur, on peut s'en satisfaire. Par ailleurs, la solution
bricolée que j'ai proposée, si elle est valable pour tout langage, n'en
est pas moins autant déviante que l'utilisation de Val dans MS.VB.dll.
D'un autre côté, ce n'est pas bien compliqué d'utiliser un des parseurs
d'expression disponibles.

J'essaie toujours d'imaginer les problèmes qui peuvent se poser quand
tous ces raccourcis commodes disparaîtront. Ça risque de coûter plus
cher que l'effort à faire pour être conforme aujourd'hui.

C'est un peu comme pour UNICODE. Il y a un tas de programmeurs C/C++
qui continuent d'ignorer surperbement la chose, qui continuent de
traiter les char comme des BYTEs, etc. Un jour ou l'autre, ça se paiera.
Et plus ils attendent, plus la facture sera lourde, alors que l'effort
d'adaptation est minime. La compatibilité ascendante, bien qu'étant
l'objet de toutes les attentions de la part de Microsoft (OK, le plus
souvent :-) ), a ses limites quand un saut technologique s'avère
nécessaire. Le bon développeur, c'est celui qui sait anticiper ces
évolutions et limiter la casse quand ça arrive. AMHA.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr