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> |
Partager