IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Stratégie]Résultat d'une formule sous forme de String [Débutant(e)]


Sujet :

Langage Java

  1. #1
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut [Stratégie]Résultat d'une formule sous forme de String
    Bonjour à tous.

    Je dois effectuer des calculs numériques, dont je récupère la formule de calcul, mais je ne vois pas du tout comment je peux interprétere cette formule pour obtenir son résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String formule = "12/(2.5+3.5+0.5*8)*2";
    double result = Double.parseDouble(formule);
    Voilà, en gros je voudrais faire ce qu'il y a juste au dessus... sauf que, la méthode parseDouble(), dans mon cas me renvoie un NumberFormatException.
    Bref au final je voudrais avoir (dans notre cas...) 2.4 dans mon attribut result.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  2. #2
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Salut,

    Pas le choix il faut que tu écrive une fonction qui traite et interpréte ta chaîne...

  3. #3
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    salut,

    à ma connaissance il n'y a rien que le fasse tout seul, tu seras obligé de faire les calculs toi meme à partir de la chaine. J'avais aussi du le faire dans une calculette ou l'utilisateur entrait le calcul sous la forme d'une chaine de caractères

  4. #4
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    OK, ben merci !!!!

    Vu les timing, ça va être à voir avec le chef de projet.

    Si jamais je l'a développe, je vous tiens au courant, et vous livrerai une petite méthode "toute faite".

    Merci encore.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Cela ne sert à rien de réinventer la roue tous les jours... et il ne faut pas forcément se limiter à l'API standard : Pensez à jeter un coups d'oeil à la page des API Java de Developpez.com, et à faire des recherches sur Google

    JEP - Java Math Expression Parser


    a++

  6. #6
    Membre éprouvé
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Points : 1 085
    Points
    1 085
    Par défaut
    Sinon il y à le BeanSriptingFramework http://jakarta.apache.org/bsf/ et utiliser la fonction éval de JavaScript.

    A+

  7. #7
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    Cool

    dire que je m'étais fait chier à faire tout un truc pour le faire moi-meme ^^

  8. #8
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Citation Envoyé par wichtounet
    dire que je m'étais fait chier à faire tout un truc pour le faire moi-meme ^^
    Ben si ça ne te déranges pas de le partager, je veux bien y jeter un oeil.

    Citation Envoyé par adiGuba
    JEP - Java Math Expression Parser
    En effet, je ne l'avait pas regardé... désolé ! Par contre, c'est dans le cadre d'une application commerciale, il va donc falloir jouer serré pour pouvoir faire passer une extension du budget auprès du client.

    Citation Envoyé par thibaut
    Sinon il y a le BeanSriptingFramework
    Je n'ai pas encore eu trop le temps de la regarder dans les moindres détails, je vais l'essayer de suite. Par contre, je n'ai pas encore trouvé la javadoc... donc si tu sais l'utiliser et que tu as la(les) ligne(s) de code pour utiliser la fonction eval de javaScript, je suis partant aussi (PS : Ne te prends pas la tête, si tu ne l'as pas sous la main, ne cherches pas pendant des heures, je n'ai, moi même, pas encore eu le temps de vraiment chercher...)

    Citation Envoyé par adiGuba
    Cela ne sert à rien de réinventer la roue tous les jours...
    Et m****, moi qui pensais devenir célèbre !!!!
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  9. #9
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    En fait, je suis en train de regarder les méthodes eval() et toutes me prennent une foule de paramètres (bon d'accord des petites fouoles puisqu'elles en prennent 4 ou 5 suivant que je suis avec un BSFEngine ou un BSFManager) dont je ne connais pas le but exact... Comme quoi la javadoc ça sert.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  10. #10
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Je viens d'essayer de faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    			Object o1 = new Object();
    			Object o2 = new Object();
    			JavaScriptEngine javaScriptEngine = new JavaScriptEngine();
    			try{
    				o2 = javaScriptEngine.eval("12/(5+3+2)",2, 2, o1);
    			}catch(Exception e){
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    //			BSFManager bsfManager = new BSFManager();
     
    			System.out.println("computationResult o1 = "+o1+" --- o2 = "+o2);
    Et je me retrouve avec java.lang.NoClassDefFoundError: org/mozilla/javascript/JavaScriptException sur la ligne ou j'instancie mon JavaScriptEngine.

    Je crois que je vais arrêter le carnage pou ce soir... j'y réfléchirais demain, à tête reposée.
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 147
    Points : 155
    Points
    155
    Par défaut
    Ou alors tu la recodes
    Arbre binaire, parcours infixe et c'est parti !

  12. #12
    Expert éminent sénior
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Points : 21 324
    Points
    21 324
    Par défaut
    wichtounet a écrit:
    dire que je m'étais fait chier à faire tout un truc pour le faire moi-meme ^^

    Ben si ça ne te déranges pas de le partager, je veux bien y jeter un oeil.
    non ca me dérange pas de le partager, mais c'est extrement basique, et ca peut etre beaucoup optimisé... Ca ne gérait que + - * / C'était un des premiers projets qu'on avait eu à faire à l'école, je ne pense pas que ca puisse te servir à quelque chose ^^

  13. #13
    Membre éprouvé Avatar de leminipouce
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2004
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2004
    Messages : 754
    Points : 1 253
    Points
    1 253
    Par défaut
    Bon ben finalement, d'un commun accord avec le chef de projet, on a trouvé une solution plutôt efficace : le RPN (pour Reverse Polish Notation).
    Grâce à cette écriture, je me retrouve avec des formules du genre :
    12 4 3 1 1.5 0.5 + + + + /
    au lieu de
    12 / ( 4 + 3 + 1 + 1.5 + 0.5 )
    pour avoir comme résultat 1.2.

    Dans cette optique là, le traitement devient simplissime avec les opérateurs binaires. Et on s'affranchit du problème des parenthèses... et nos calculs ne devaient pas aller chercher plus loin dans leur complexité .
    Voici le code, libre à vous de lui ajouter les exposants, PI ou tout autre chose, mais vu d'ici je n'y vois pas trop de problèmes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    	/**
             * Performs the computations based on RPN (Reverse Polish Notation).
             * You should have one operand more than operators.
             * 
             * @param computationValues contains all the values for the computation
             * @param computationElements contains all the operator for the computation
             * 
             * @return result of the computation.
             */
    	private float compute(Vector computationValues, Vector computationElements) {
    		float computationResult = 0;
     
    		try{
    			if(computationElements.size()==0){	//No operator is defined... return only the first value
    				computationResult = ((Float)(computationValues.get(0))).floatValue();
    			}else{
    				float operand = 0;
    				int operator = 0;
     
    				computationResult = ((Float)(computationValues.get(0))).floatValue();
    				for(int i=0; i<computationElements.size();i++){
    					operand = ((Float)(computationValues.get(i+1))).floatValue();
    					operator = ((String)(computationElements.get(i))).charAt(0);
    					switch(operator){
    						/*BEWARE:
    						 * For PLUS, and MULTIPLY, operand location (compared to operator)
    						 * have no importance.
    						 * Otherwise, for MINUS and DIVIDE, they are important.
    						 */
    						case PLUS:
    							computationResult += operand;
    							break;
     
    						case MINUS:
    							computationResult = operand - computationResult;
    							break;
     
    						case MULTIPLY:
    							computationResult *= operand;
    							break;
     
    						case DIVIDE:
    							computationResult = operand / computationResult;
    							break;
     
    						default:
    							break;
    					}
    				}
    			}
    		}catch(Exception e){
    			System.out.println("Numbers of operands and operators are different.");
    			e.printStackTrace();
    		}
     
    		return computationResult;
    	}
    PS : Comme vous pouvez le voir, il faut au préalable séparer les opérandes et les opérateurs. Cela permet de pouvoir utiliser cette méthode même sur des formules de calcul traditionnelles, mais qui ne prennent comme opérateurs QUE des opérateurs BINAIRES, et qui n'attachent aucune importance aux priorités... bref il vaut mieux rester sur du RPN
    Si , et la ont échoué mais pas nous, pensez à dire et cliquez sur . Merci !

    Ici, c'est un forum, pas une foire. Il y a de respectables règles... à respecter !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Stocker une liste sous forme de String?
    Par professeur shadoko dans le forum Hibernate
    Réponses: 4
    Dernier message: 14/09/2013, 19h11
  2. Résultat d'une fonction sous forme de tableau
    Par Touty01 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 31/05/2010, 23h35
  3. [MySQL] Une fonction qui renverrait tout le résultat de la requête sous forme de array
    Par piotrr dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 04/03/2009, 17h11
  4. récupérer le résultat d'une requête sous forme de dictionnaire
    Par davidbkh dans le forum Général Python
    Réponses: 2
    Dernier message: 03/01/2008, 16h15
  5. résultat de requêtte sql sous form de table
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 5
    Dernier message: 08/03/2004, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo