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

Contribuez Discussion :

Calculateur sans peine


Sujet :

Contribuez

  1. #1
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut Calculateur sans peine
    Réécriture d'une ancienne tentative: un "calculateur" sans risque. A tester.

    http://javatwist.imingo.net/calc.htm

    Code html : 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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    <!DOCTYPE html>
    <html lang="fr">
    <head>
    <meta charset="UTF-8">
    <title>Calculer sans souci...</title>
    <style>
    body{background:gray;font-weight:bold;font-size:25px;}
    #topo{margin:50px;}
    #go{margin:50px;}
    #calc{width:300px;}
    #bilan{margin-top:50px;text-align:center;}
    #retour{margin:20px;color:lime}
    </style>
    <script>
    "use strict";
    window.addEventListener("load",()=>{
            // tableau de correspondances entre opérateurs javascript et opérateurs saisis
            const rg={'.':',','*':'xX','\/':':','(':'({[',')':')}]'};
     
            document.getElementById("calc").addEventListener("change",(e)=>{
                    // Cette fonction n'est pas une assistance à* la saisie de calculs:
                    // elle permet juste d'éviter les erreurs javascript et les saisies indélicates
                    // Quelques rectifications de saisie sont faites cependant
                    document.getElementById("retour").textContent="";
                    let n=e.target,q;
                    n.value=n.value.replace(
                            // opérateurs 4 opérations (+ puissances) et parenthèses convertis
                            /[X:,{\[}\]]/gi,(c)=>{
                            for(let r in rg){if(rg[r].includes(c)){return r}}}).replace(
                            // refus des chaînes, opérateurs exotiques et appels de fonctions
                            /[^\d\(\)+*\/.-]|\(\D*\)/gi,"").replace(
                            //simplification des points multiples
                            /\.+/g,".").replace(
                            //simplification des zéros à* gauche
                            /([^\d.]|^)0+/g,"$1"+"0").replace(
                            // suppression du dernier zéro à* gauche uniquement avant un chiffre
                            /([^\d.]|^)0(\d)/g,"$1$2").replace(
                            // ajout d'un zéro à* la partie entière pour décimaux < 1, si l'utilisateur l'a oublié
                            /([^\d]|^)\./g,"$1"+"0.").replace(
                            //suppression de la partie décimale si elle est nulle
                            /\.(0*)(\D|$)/g,"$2")
            // eviluation (^_^) de la saisie
            try{q=eval(n.value)}
            catch(e){       
                    // récupération du message d'erreur éventuel
                    document.getElementById("retour").textContent="["+e.message+"]";
            }finally{
                    // Si le résultat n'est pas un nombre, on le signale
                    document.getElementById('res').value=isNaN(q)? "erreur de calcul" : 
                    // Sinon, on arrondit les décimaux au millième
                    q.toString().includes(".") ? q.toFixed(3).replace(/(\.?)0*$/,"") :
                    // Et on affiche les entiers normalement...
                    q.toString().replace("Infinity","Impossible!");
            }
            },false);
    },false);
    </script>
    </head>
    <body>
     
    <div id="topo">
    Une manière simple d'effectuer des calculs,
    sans risque de bugs.<br />
    Les résultats sont arrondis au millième.<br />
    Un code erroné ne sera pas exécuté, juste signalé.
    </div>
     
    <div id="go">
    	<label for="calc">Entrez une instruction mathématique puis quittez la zone</label>
    	<input id="calc" type="text" />
    </div>
     
    <div id="bilan">
    	<div>Résultat </div>
    	<input id="res" type="text" />
    	<div id="retour"></div>
    </div>
     
    </body>
    </html>

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Maj pour inclure racine carrée et nombre Pi.

    ==> légères Transformations des lignes 30 à 43
    http://javatwist.imingo.net/calc.htm

    Code javascript : 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
     
                            // refus des chaînes hors P ou R, opérateurs exotiques et appels de fonctions
    			/[^RP\d\(\)+*\/.-]|\([^\dPR]*\)/g,"").replace(
    			//simplification des points multiples
    			/\.+/g,".").replace(
    			//simplification des zéros à gauche
    			/([^\d.]|^)0+/g,"$1"+"0").replace(
    			// suppression du dernier zéro à gauche uniquement avant un chiffre
    			/([^\d.]|^)0(\d)/g,"$1$2").replace(
    			// ajout d'un zéro à la partie entière pour décimaux < 1, si l'utilisateur l'a oublié
    			/([^\d]|^)\./g,"$1"+"0.").replace(
    			//suppression de la partie décimale si elle est nulle
    			/\.(0*)(\D|$)/g,"$2");
    			// eviluation (^_^) de la saisie
    	try{q=eval(n.value.replace(
                            // Racine de l'expression entre R et R
    			/R([^R]+)R/g,"Math.sqrt($1)").replace(
                            // Pi
    			/P/g,"Math.PI")
    			)
    	}

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 681
    Points : 5 221
    Points
    5 221
    Par défaut
    Suite à un joli sujet sur le forum javascript, petite simplification

    http://javatwist.imingo.net/calc.htm

    Code javascript : 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
    "use strict";
    window.addEventListener("load",()=>{
    	// tableau de correspondances entre opérateurs javascript et opérateurs saisis
    	document.getElementById("calc").addEventListener("change",(e)=>{
    		const rg={'.':',','*':'xX','\/':':','(':'({[',')':')}]'};
    		// Cette fonction n'est pas une assistance à la saisie de calculs:
    		// elle permet juste d'éviter les erreurs javascript et les saisies indélicates
    		// Quelques rectifications de saisie sont faites cependant
    		document.getElementById("retour").textContent="";
    		let n=e.target,q;
    		n.value=n.value.replace(
    			// opérateurs 4 opérations (+ puissances) et parenthèses convertis
    			/[X:,{\[}\]]/gi,(c)=>{
    			for(let i in rg){if(rg[i].includes(c)){return i}}}).replace(
    			// refus des chaînes, opérateurs exotiques et appels de fonctions
    			// hors "Pi" et "Racine carrée"
    			/[^RP\d\(\)+*\/.-]|\([^\dPR]*\)/g,"").replace(
    			//simplification des zéros à gauche et en fin de partie décimale
    			/(\d+\.?\d*)/g,(i)=>{return parseFloat(i)})
    			// eviluation (^_^) de la saisie
    	try{q=eval(n.value.replace(
    			/R([^R]+)R/g,"Math.sqrt($1)").replace(
    			/P/g,"Math.PI")
    			)
    	}
    	catch(e){	
    		// récupération du message d'erreur éventuel
    		document.getElementById("retour").textContent="["+e.message+"]";
    	}finally{
    		// Si le résultat n'est pas un nombre, on le signale
    		document.getElementById('res').value=isNaN(q)? "Erreur de calcul" : 
    		// Sinon, on arrondit les décimaux au millième
    		q.toString().includes(".") ? q.toFixed(3).replace(/(\.?)0*$/,"") :
    		// Et on affiche les entiers normalement...
    		q.toString().replace("Infinity","Impossible!");
    	}
    	},false);
    },false);

Discussions similaires

  1. Comment dériver d'une TList sans trop de peine ?
    Par WebPac dans le forum Langage
    Réponses: 19
    Dernier message: 31/03/2006, 18h53
  2. MDI sans MFC, possible ?
    Par delire8 dans le forum MFC
    Réponses: 4
    Dernier message: 17/06/2002, 07h38
  3. [Kylix] Fiches sans bordure
    Par alex dans le forum EDI
    Réponses: 4
    Dernier message: 28/04/2002, 21h19

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