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

PHP & Base de données Discussion :

Problème virgule / point sur float ?


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut Problème virgule / point sur float ?
    Bonjour,

    Je rencontre le problème suivant : pour une application comptable, ma base de donnée contient des tarifs et à partir de ceux-ci je créé des lignes de quittance.

    Tout se passe bien la plupart du temps mais je rencontre parfois un problème de virgule :
    au lieu de travailler sur une donnée au format decimal Americain ###.##
    le script se met à travailler avec une donnée au format francais : ###,## ce qui entraine des erreurs de calcul et la plupart du temp une donnée à zéro.

    Ne comprenant pas d'où vient l'erreur, j'ai tenté de remplacer la virgule par un point mais rien n'y fait, je me retrouve avec des virgules partout !

    Voici le bout de code qui ne va pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Logger('Prime OK '.$Prime);
    $Prime = Math::certifyFloat($Prime);
    Logger('Prime converted '.$Prime);
     
    // ET LA FONCTION certifyFloat :
    function certifyFloat($SupposedFloat) {
    	$certifiedFloat=(preg_replace("/,/",".",$SupposedFloat));
    	$certifiedFloat=floatval(preg_replace("/^[^0-9\.]/","",$certifiedFloat));
    	return $certifiedFloat;
    }
    Ceci me donne en logs :
    20110826 15:07:05 Prime OK 9,9
    20110826 15:07:05 Prime converted 9,9

    Le pire étant que l'utilisateur recevant une erreur n'a qu'a relancer l'opération pour ca marche bien :
    20110826 15:07:23 Prime OK 9.9
    20110826 15:07:23 Prime converted 9.9


    L'opération est effectuée +-3000 fois par jour et survient d'une à cinq fois par jour.

    La version de php est la 5.3.5.0 sur un windows 2008 server R2 (ca faisait pareil en 2003). L'appli tourne sous symfony 1.0.11.

    ANY IDEA ?
    D'avance merci.

  2. #2
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Question annexe :
    Pourquoi ne pas avoir utilisé str_replace au lieu de preg_replace ?

  3. #3
    Membre Expert Avatar de Marc3001
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2008
    Messages
    829
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2008
    Messages : 829
    Par défaut
    Citation Envoyé par enki.bilal Voir le message
    Le pire étant que l'utilisateur recevant une erreur n'a qu'a relancer l'opération pour ca marche bien :
    20110826 15:07:23 Prime OK 9.9
    20110826 15:07:23 Prime converted 9.9

    L'opération est effectuée +-3000 fois par jour et survient d'une à cinq fois par jour.
    Ca peux pas être aléatoire. Il y a forcément un moment où un grain de sable vient s'insérer. Faut juste repérer où et quand.

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Note:

    Le point décimal est défini dans la locale du script (catégorie LC_NUMERIC). Reportez-vous à la fonction setlocale().
    Avertissement

    L'information locale est maintenue par processus, non par thread. Si vous faites fonctionner PHP sur un serveur multi-threadé comme IIS ou Apache sur Windows, vous pourriez obtenir des changements soudains des configurations locales pendant qu'un script fonctionne, même si celui-ci n'appelle jamais la fonction setlocale(). Ceci survient à cause des autres scripts qui fonctionnent dans des threads différents du même processus. Ces scripts changent les configurations locales dans le processus au complet en utilisant la fonction setlocale().
    Concerné (logguer setlocale(LC_NUMERIC, '0') ?) ? Avez-vous tenté de la (locale pour LC_NUMERIC) redéfinir explicitement (pour 'C') ?

    De toute façon, ces transformations ne servent à rien si PHP les reformate derrière (lors d'une cast, même implicite, float => string).

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut Set Locales bonne piste
    Merci pour vos réponses précise et trés précise.

    Je sais que Symfony utilise les set_locales. (actuellement, on ne les utilise pas vu qu'on fait une appli franco-francaise à usage interne). Je vais étudier tout ca de plus près et vous tiendrais au courant dés là résolution (si résolution il y a).

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Citation Envoyé par Shikiryu Voir le message
    Question annexe :
    Pourquoi ne pas avoir utilisé str_replace au lieu de preg_replace ?
    Parceque sur php 5.3.5.0, str_replace "IS DEPRECATED" du moins c'est ce que m'ont dit les warning ou notices quand on a changé de serveur.

  7. #7
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Ce serait bien qu'ils mettent à jour leurs docs alors car rien de deprecated n'est annoncé sur la page str_replace (apparemment même en 5.3.2, elle ne l'est pas)...
    Mais bon, merci d'avoir répondu à ma question

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Citation Envoyé par Shikiryu Voir le message
    Ce serait bien qu'ils mettent à jour leurs docs alors car rien de deprecated n'est annoncé sur la page str_replace (apparemment même en 5.3.2, elle ne l'est pas)...

    Ca m'a semblé bizarre aussi, mais bon, on a viré les str_replace lors de la migration...

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Effectivement,
    Un collègue m'a dit à midi qu'il avait un eu problème depuis un an sur une page de l'intranet (peu appelée), les dates se mettaient parfois en anglais, alors il a mis un setlocale pour verrouiller le tout...

    Encore Merci...

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

Discussions similaires

  1. [AC-2010] Problème virgule et point sur pavé numérique
    Par titisoft43 dans le forum Access
    Réponses: 1
    Dernier message: 04/08/2014, 17h24
  2. Problème d'interprétation de float sur IE
    Par Fleep dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 30/01/2007, 17h13
  3. [Tableaux] Problème de typage sur un float
    Par Lomu dans le forum Langage
    Réponses: 1
    Dernier message: 06/11/2006, 11h47
  4. [FLASH MX] Problème de point virgule
    Par noarno dans le forum Flash
    Réponses: 4
    Dernier message: 20/07/2004, 15h24

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