Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/08/2011, 16h49   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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 :
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.
enki.bilal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 17h01   #2
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
Question annexe :
Pourquoi ne pas avoir utilisé str_replace au lieu de preg_replace ?
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/08/2011, 17h15   #3
Membre chevronné
 
Avatar de Marc3001
 
Homme
Ingénieur développement logiciels
Inscription : février 2008
Messages : 430
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

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

Informations forums :
Inscription : février 2008
Messages : 430
Points : 682
Points : 682
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.
__________________
Le logiciel, c'est comme le sexe, c'est meilleur quand c'est libre.

Linus Torvalds
Marc3001 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/08/2011, 17h46   #4
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Note:

Le point décimal est défini dans la locale du script (catégorie LC_NUMERIC). Reportez-vous à la fonction setlocale().
Citation:
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).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 09h06   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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).
enki.bilal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 09h10   #6
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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.
enki.bilal est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 29/08/2011, 10h36   #7
Membre chevronné
 
Homme
Développeur Web
Inscription : mars 2011
Messages : 399
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

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

Informations forums :
Inscription : mars 2011
Messages : 399
Points : 662
Points : 662
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
__________________
Membre de StackOverflow, je suis un fervant utilisateur de PHP et de jQuery.
Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web mais aussi plusieurs projets personnels.
Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, un raccourcisseur d'url, un bookmarklet pour envoyer l'url de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc...
Shikiryu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 13h27   #8
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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...
enki.bilal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 13h50   #9
Invité de passage
 
Inscription : décembre 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 5
Points : 0
Points : 0
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...
enki.bilal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h12.


 
 
 
 
Partenaires

Hébergement Web