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

JavaScript Discussion :

Fonctions scientifiques pour calculatrice


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Reconverti Dev Web
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2019
    Messages : 88
    Par défaut Fonctions scientifiques pour calculatrice
    Bonjour,

    Je suis train de faire une calculatrice en Javascript/HTML avec affichage sur une ligne.

    Les opérateurs et les nombres sont donc présent dans le même textaera ou input.

    Pour commencer j'ai utilisé la methode eval(string), mais celle-ci ne fonctionne pas quand on veut utiliser les methodes Math.sqrt, Math.Pi etc...

    Quelle est l'alternative?

    Voici mon code avec une regex pour Math.sqrt qui renvoi "illegal character" sur firefox:

    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
     
    equal.onclick = () => {  
    	let resultat = calculLine.value; //calculLine represente un textaera
    	let regexSquare = /(^\(?\d*\)?$)²/;
     
    	resultat = resultat.replace(regexSquare,"Math.sqrt($1)" );
     
    		try 
    		{
    		    result.innerHTML = `${resultat} = ${eval(resultat)}`; } //result est une div servant à l'affichage du resultat
    		catch(e) 
    		{
    		    result.innerHTML=`${resultat} => Syntax Error`; //
    		}
     
    };

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    Par défaut
    ta fonction racine, par exemple, n'est pas opérationnelle si tu ne spécifies pas un début et une fin à la chaîne traitée;
    racine(2X3) est différent de (racine 2) X 3;

  3. #3
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    Par défaut
    Mettons que ta calculatrice génère un R avant l'expression à traiter et un r après...

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    resultat = resultat.replace(/R([^Rr]+)r/g,"Math.sqrt($1)");

  4. #4
    Membre confirmé
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Reconverti Dev Web
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2019
    Messages : 88
    Par défaut
    En effet le problème venait de ma regex qui ne tenait pas la route, j'ai forcé l'ajout des parenthèses afin d'eviter ces bugs


    Avec celle-ci ça l'air de fonctionner:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    regexSquare = /√\((.*)\)/; //capture tout ce qui commence par "√(" et finit par ")" les symboles bizarres représentent l'unicode racine
    resultat = resultat.replace(regexSquare,"Math.sqrt($1)" ); // Ex: √(2+5) => Math.sqrt(2+5)

  5. #5
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    Par défaut
    Tu vas encore avoir des problèmes de délimitation de la racine...

  6. #6
    Membre confirmé
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Reconverti Dev Web
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2019
    Messages : 88
    Par défaut
    C'est vrai, si j'ai plus d'une racine dans mon expression ça me fait une erreur.

    Comment s'en sortir?
    replace() ne change pas tous les motifs rencontrés?

  7. #7
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    Par défaut
    Tu comptes sur la bonne volonté de l'utilisateur... Ce n'est pas bête mais c'est générateur de bugs... voire plus puisque tu es (toi aussi ) partisan d'eval.
    Même si tu interdis le clavier et le copier-coller, tu dois accepter que le client clique où il veut pour tester les limites de ton programme.
    Bref, tu gères les erreurs...

  8. #8
    Membre confirmé
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Reconverti Dev Web
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2019
    Messages : 88
    Par défaut
    Y a t'il une alternative à eval(), j'ai parcouru les forums sur le net et tous le monde utilise cette fonction pour les calculs sur 1 ligne, bien qu’elle soit déconseillée.

  9. #9
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    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 684
    Par défaut
    Je répète: la gestion d'erreurs est la solution la plus fiable.

    http://javatwist.imingo.net/calc.htm (mise à jour)

Discussions similaires

  1. fonction c pour manipuler la structure date
    Par thomas_b dans le forum Windows
    Réponses: 4
    Dernier message: 28/07/2004, 16h28
  2. [winsock.h] Fonction recv() pour un socket en C
    Par Hikaru dans le forum Windows
    Réponses: 5
    Dernier message: 22/05/2004, 07h43
  3. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59
  4. Fonction/méthode pour obtenir l'IP de la machine
    Par sirex007 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 10/04/2003, 14h36
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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