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 du Club
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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
    Points : 56
    Points
    56
    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 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
    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 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
    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 du Club
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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
    Points : 56
    Points
    56
    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 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
    Tu vas encore avoir des problèmes de délimitation de la racine...

  6. #6
    Membre du Club
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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
    Points : 56
    Points
    56
    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 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
    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 du Club
    Homme Profil pro
    Reconverti Dev Web
    Inscrit en
    Septembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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
    Points : 56
    Points
    56
    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 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
    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