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

Langage PHP Discussion :

Conversion d'une chaîne en nombre


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Par défaut Conversion d'une chaîne en nombre
    Bonjour,
    Dans un script, je retraire une page web pour en retirer les informations voulues, notamment un prix. Le problème est que ce prix, récupéré sous le format "18,00", est de type string et ne permet pas une comparaison. J'ai tout essayé : intval(), floatval(), round(), number_format(), rien ne fonctionne, j'ai toujours à la fin une valeur égale à 0 (ou 0,00 si je demande des décimales). J'ai même essayé de remplacer la virgule par un point au cas où, mais ça persiste. Je désespère

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $pos_deb_prix = strpos($valeur, "<span class=\"PBSalesPrice\">"); //Récupération du début de la chaîne voulue
    $pos_fin_prix = strpos($valeur, "</span>", $pos_deb_prix); //Récupération de la fin de la chaîne voulue
    $len_prix = ($pos_fin_prix - $pos_deb_prix)-2; //Calcul de la longueur de chaîne (-2 pour l'€ et l'espace précédent)
    $prix = str_replace(",", ".", substr($valeur, $pos_deb_prix, $len_prix)); //On récupère la portion voulue

  2. #2
    Membre régulier Avatar de bhamza
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2010
    Messages : 11
    Par défaut
    Vous pouvez mettre une exemple de la valeur du variable $valeur.

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Par défaut
    $valeur comprend la ligne retraitée dans la page web lue. Le problème se situe non pas à la récupération des données, mais pour la conversion en nombre.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    Bonjour,

    Si tu es sur de n'avoir aucun probleme lors de l'extraction de la valeur alors essaye:
    EDIT: j'ai pris ton code (copié/coller) dans mon éditeur et j'ai affecter une valeur a la variable $valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $valeur = "<span class=\"PBSalesPrice\">18,10 €</span>";
    $pos_deb_prix = strpos($valeur, "<span class=\"PBSalesPrice\">"); //Récupération du début de la chaîne voulue
    $pos_fin_prix = strpos($valeur, "</span>", $pos_deb_prix); //Récupération de la fin de la chaîne voulue
    $len_prix = ($pos_fin_prix - $pos_deb_prix)-2; //Calcul de la longueur de chaîne (-2 pour l'€ et l'espace précédent)
    $prix = str_replace(",", ".", substr($valeur, $pos_deb_prix, $len_prix)); //On récupère la portion voulue
    echo $prix;
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <span class="PBSalesPrice">18.10 à
    (dsl pour l'erreur d'encodage mais je fais se test a la va vite parce que je n'ai pas le temps)

    donc il y a une erreur lorsque tu extrait le prix puisque effectivement la premiere occurence de <span class="PBSalesPrice"> est bien a l'indice 0 de la chaine de caractere.

    une solution pondu rapidement, c'est pas forcement la mieux mais pour moi sa marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    $valeur = "<span class=\"PBSalesPrice\">    18,10   €    </span>"; //j'ai cree cette ligne pour tester ton code
     
    $valeur = str_replace("<span class=\"PBSalesPrice\">", '',$valeur); //on remplace se que l'on veut supprimer par ... rien
    $valeur = str_replace("</span>", '', $valeur);
    $valeur = str_replace(' ','',$valeur); // on retire tout les espace.
    $valeur = substr($valeur, 0, strlen($valeur)-1);//on retire le dernier caractere de la chaine qui doit etre euro
    $prix = (float)str_replace(",", ".", $valeur); // on remplace la virgule par un point 
     
    echo $prix; // j'affiche le résultat (toujours pour les test)
    En esperant t'avoir aider.
    Je ne t'ai pas donner LA solution. elle est tres largement améliorable.
    Je ne peut te conseiller qu'une chose: teste ton code!!!!




    Nicolas,

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 201
    Par défaut
    Je n'ai pas trop le temps d'approfondir ce soir, mais en utilisant ton code, j'ai le même problème (testé sous mon éditeur PHP).

    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
    <?php
     
    $valeur = "<span class=\"PBSalesPrice\">18,10 €</span>";
    $pos_deb_prix = strpos($valeur, "<span class=\"PBSalesPrice\">"); //Récupération du début de la chaîne voulue
    $pos_fin_prix = strpos($valeur, "</span>", $pos_deb_prix); //Récupération de la fin de la chaîne voulue
    $len_prix = ($pos_fin_prix - $pos_deb_prix)-2; //Calcul de la longueur de chaîne (-2 pour l'€ et l'espace précédent)
    $prix = str_replace(",", ".", substr($valeur, $pos_deb_prix, $len_prix)); //On récupère la portion voulue
    echo "/$prix/<br />"; //Les / permettent de vérifier qu'il n'y a pas d'espace gênant.
    $prix = (float)$prix;
     
    echo $prix;
     
    echo "<br />".phpversion();
     
    ?>
    Me donne

    /18.10/
    0
    5.2.11
    Problème de version de PHP ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2009
    Messages : 6
    Par défaut
    le code qui marche et que je t'ai donné est celui ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?php
    $valeur = "<span class=\"PBSalesPrice\">    18,10   €    </span>"; //j'ai cree cette ligne pour tester ton code
     
    $valeur = str_replace("<span class=\"PBSalesPrice\">", '',$valeur); //on remplace se que l'on veut supprimer par ... rien
    $valeur = str_replace("</span>", '', $valeur);
    $valeur = str_replace(' ','',$valeur); // on retire tout les espace.
    $valeur = substr($valeur, 0, strlen($valeur)-1);//on retire le dernier caractere de la chaine qui doit etre euro
    $prix = (float)str_replace(",", ".", $valeur); // on remplace la virgule par un point 
     
    echo $prix; // j'affiche le résultat (toujours pour les test)
    resultat :
    des amelioration peuvent etre apporté mais tel qu'il est écrit la il fonctionne normalement.
    je supprime se que je ne veut pas a l'aaide de str_replace.
    je retire tout les espace toujours a l'aide de str_replace
    et enfin je retire le caractere€
    j'utilise le transtypage afin d'obtenir une variable "numérique"

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    Citation Envoyé par eric41 Voir le message
    Je n'ai pas trop le temps d'approfondir ce soir, mais en utilisant ton code, j'ai le même problème (testé sous mon éditeur PHP).

    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
    <?php
     
    $valeur = "<span class=\"PBSalesPrice\">18,10 €</span>";
    $pos_deb_prix = strpos($valeur, "<span class=\"PBSalesPrice\">"); //Récupération du début de la chaîne voulue
    $pos_fin_prix = strpos($valeur, "</span>", $pos_deb_prix); //Récupération de la fin de la chaîne voulue
    $len_prix = ($pos_fin_prix - $pos_deb_prix)-2; //Calcul de la longueur de chaîne (-2 pour l'€ et l'espace précédent)
    $prix = str_replace(",", ".", substr($valeur, $pos_deb_prix, $len_prix)); //On récupère la portion voulue
    echo "/$prix/<br />"; //Les / permettent de vérifier qu'il n'y a pas d'espace gênant.
    $prix = (float)$prix;
     
    echo $prix;
     
    echo "<br />".phpversion();
     
    ?>
    Me donne



    Problème de version de PHP ?
    Salut,

    Non, problème de compréhension du code je dirai !

    Ton strpos sur ta balise <span class=... te renvoie la position du premier caractère de la chaine trouvée, donc ici "0". Quand tu fais un substr de la position de début à la position de fin, tu fais donc de l'indice 0 à l'indice du premier caractère de </span>, ce qui te renvoie <span class=[...]>18,10 €.

  8. #8
    Membre éprouvé
    Inscrit en
    Décembre 2007
    Messages
    94
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2007
    Messages : 94
    Par défaut
    Bonjour,
    Le code ci marche parfaitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
    $valeur = "<span class=\"PBSalesPrice\">    18,10   €    </span>"; //j'ai cree cette ligne pour tester ton code
     
    $valeur = str_replace("<span class=\"PBSalesPrice\">", '',$valeur); //on remplace se que l'on veut supprimer par ... rien
    $valeur = str_replace("</span>", '', $valeur);
    $valeur = str_replace(' ','',$valeur); // on retire tout les espace.
    $valeur = substr($valeur, 0, strlen($valeur)-1);//on retire le dernier caractere de la chaine qui doit etre euro
    $prix = (float)str_replace(",", ".", $valeur); // on remplace la virgule par un point 
     
    echo $prix;
     
    ?>

  9. #9
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 3
    Par défaut
    Pour convertir tes données string en numérique t'as deux étapes :
    1- Remplacer la virgule par un point.
    2- Convertir ton string avec un cast en utilisant le type voulu entre parenthèses.

    voilà une fonction qui peux te faire les deux opérations tu peux même l’intégré dans une classe comme une méthode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php 
    function strTonum($str)
    { 
       if(strpos($str, '.') < strpos($str,','))
      { 
                $str = str_replace('.','',$str); 
                $str = strtr($str,',','.');            
       } 
        else
       { 
               $str = str_replace(',','',$str);            
        } 
         return (float)$str; 
    }?>

Discussions similaires

  1. Conversion d'une date en nombre
    Par marcusien dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/03/2007, 11h24
  2. conversion d'une chaîne hexadécimale en 3 int
    Par loacast dans le forum C++
    Réponses: 2
    Dernier message: 27/02/2007, 15h45
  3. Réponses: 4
    Dernier message: 21/09/2005, 17h35
  4. Conversion d'une chaîne en tableau d'octets
    Par marsupilami34 dans le forum Langage
    Réponses: 11
    Dernier message: 22/06/2005, 14h44
  5. [datetime] conversion d'une chaîne en une date + heure
    Par jean-jacques varvenne dans le forum Général Python
    Réponses: 2
    Dernier message: 07/04/2005, 10h43

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