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 :

Comportement de parseInt() sous Firefox [JavaScript]


Sujet :

Contribuez

  1. #1
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut ParseInt sous IE et FFX
    Un membre à soulevé un bug de parseInt que je ne connaissais pas ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <script type='text/javascript'>
    d='09'
    alert(parseInt(d))
    </script>
    cela ne survient que lorsque l'expression parsée est de form string et commence par 09 ...

    la parade:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <script type='text/javascript'>
    d='09,50'
     
    alert(parseInt(Number(d)))
    </script>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Autre façon de resoudre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <script type='text/javascript'>
    String.prototype.ParseInt = function() {return parseInt(Number(this))}
    d='091.5'
    alert(parseInt(d))
    alert(d.ParseInt())
    </script>
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Inactif
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 117
    Points : 142
    Points
    142
    Par défaut
    On tourve l'origine de ce "bug" dans la façon dont ParseInt traite les données

    parseInt pense que 09 est une valeur octale (base 8).
    il suffit de préciser en paramètre la base de conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    parseInt("09", 10) ==> 9;
    http://developer.mozilla.org/fr/docs..._et_parseFloat

  4. #4
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    C'est pas un "bug", c'est la définition de la fonction

    edit : Et vive l'édit en douce

    http://www.w3schools.com/jsref/jsref_parseInt.asp

  5. #5
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    voici le comportement de cette fonction...

    en fait elle analyse la chaine pour attribuer la base si celle ci n'est pas définie selon la règle suivante:

    Si la chaine débute par "0x", la base est 16
    Si la chaine débute par "0", la base est 8
    Si la chaine débute par autre chose la base est 10

    on peut également préciser une base 2
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Notez que ça peut dépendre de l'implémentation. Selon la norme ECMA-262 :
    If the length of S is at least 1 and the first character of S is "0", then at the implementation's discretion either let R=8 or leave R unchanged
    Donc le mieux est de toujours préciser le radix, quelque soit le cas

  7. #7
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    firefox semble rester sur une base décimale par defaut ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  8. #8
    Expert éminent

    Avatar de denisC
    Profil pro
    Développeur Java
    Inscrit en
    Février 2005
    Messages
    4 050
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 4 050
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par SpaceFrog
    firefox semble rester sur une base décimale par defaut ?
    Je n'ai pas fait le test, mais dans les specs de mozilla, ils ont bien le comportement 'normal' (à savoir en octal si il y a des zéros) :
    http://developer.mozilla.org/en/docs...tions:parseInt

  9. #9
    Futur Membre du Club
    Inscrit en
    Juin 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Comportement de parseInt() sous Firefox
    Une discussion plutôt intéressante a été supprimée assez abruptement, c'est dommage. Il y était question de la fonction parseInt() et notamment de son comportement vis à vis de l'octal, qui serait différent de la spécification sous Firefox.

    J'ai écrit rapidement un petit test que je soumet ici.
    Voici la page de test:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
    "http://www.w3.org/TR/html4/strict.dtd">
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
            <title>Tests de la fonction parseInt</title>
            <script type="text/javascript">
                function evaluate() {
                    var values = new Array();
                    values = ["00", "05", "08", "09", "010", "020", "024"];
     
                    var out_sansbase = "";
                    var out_base10   = "";
                    var out_base8    = "";
     
                    for (var i = 0; i < values.length; ++i) {
                        out_sansbase = out_sansbase + "parseInt(" + values[i] + ") = " + parseInt(values[i]) + "\n";
                        out_base10   = out_base10   + "parseInt(" + values[i] + ", 10) = " + parseInt(values[i], 10) + "\n";
                        out_base8    = out_base8    + "parseInt(" + values[i] + ", 8) = " + parseInt(values[i], 8) + "\n";
                    }
     
                    document.getElementById("sansbase").innerHTML = out_sansbase;
                    document.getElementById("base10").innerHTML = out_base10;
                    document.getElementById("base8").innerHTML = out_base8;
                }
            </script>
        </head>
        <body onload="evaluate();">
            <h1>Tests de la fonction parseInt</h1>
            <h2>Appels à parseInt sans spécifier la base</h2>
            <pre id="sansbase"></pre>
            <h2>Appels à parseInt en précisant la base 10</h2>
            <pre id="base10"></pre>
            <h2>Appels à parseInt en précisant la base 8</h2>
            <pre id="base8"></pre>
        </body>
    </html>
    Et voici le résultat obtenu:

    Tests de la fonction parseInt
    Appels à parseInt sans spécifier la base

    parseInt(00) = 0
    parseInt(05) = 5
    parseInt(08) = 0
    parseInt(09) = 0
    parseInt(010) = 8
    parseInt(020) = 16
    parseInt(024) = 20

    Appels à parseInt en précisant la base 10

    parseInt(00, 10) = 0
    parseInt(05, 10) = 5
    parseInt(08, 10) = 8
    parseInt(09, 10) = 9
    parseInt(010, 10) = 10
    parseInt(020, 10) = 20
    parseInt(024, 10) = 24

    Appels à parseInt en précisant la base 8

    parseInt(00, 8) = 0
    parseInt(05, 8) = 5
    parseInt(08, 8) = 0
    parseInt(09, 8) = 0
    parseInt(010, 8) = 8
    parseInt(020, 8) = 16
    parseInt(024, 8) = 20
    La conversion en octal implicite est donc effective dès lors que le nombre commence par un 0. Les nombres invalides (09 par exemple) sont convertis en 0 (c'est un comportement potentiellement hasardeux, puisqu'aucune erreur n'est levée).

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 661
    Points
    66 661
    Billets dans le blog
    1
    Par défaut
    Conclusion il ne s'agit pas d'un bug mais du comportement normal (mais néanmoins obscur ) de cette fonction.
    Merci à tous de vos contributions !
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comportement anormal de slideDown() sous Firefox
    Par hardShield dans le forum jQuery
    Réponses: 4
    Dernier message: 17/04/2013, 00h30
  2. drole de comportement formulaire sous firefox
    Par reventlov dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 27/06/2008, 10h49
  3. PB avec mailto et son comportement sous FireFox
    Par Bobabar dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 04/01/2006, 21h14
  4. [HTML]Image qui ne s'affiche pas sous firefox...
    Par OrangeBud dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 13/10/2004, 13h42
  5. Java ne fonctionne pas sous Firefox
    Par Info-Rital dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 29/07/2004, 23h37

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