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>