Rechercher : dans
Par :

[PHP][OPERATEUR==][RESULTAT ETRANGE]

Dernière réponse le 26 déc 2007 à 03:02:10 efflamm, le 21 déc 2007 à 02:53:25 
 Signaler ce message aux modérateurs

Bonjour,

Le contexte :
Un script php parse ligne par ligne un fichier texte et effectue une additionn des valeurs ensemble( TVA+HT==TTC) et fait une comparaison à l'aide de == , hors dans certains cas l'opération est mathématiquement juste, mais PHP me sort un resultat bizarre.Les lignes sont en italiques dans le dernier extrait d'affichage. Merci d'avance pour toute aide ou piste ;-)

la plateforme:
Apache/2.0.55 (Debian) PHP/5.1.6-1

Le fichier texte qu'on traite:

081207, TA550,AAAAAA,D, 454.48,C, 380.00,C, 74.48,
081207, TA551,BBBBBB,D, 5502.37,C, 4400.00,C, 200.64,C, 901.73,
081207, TA552,,D, 5262.40,C, 4400.00,C, 862.40,
081207, TA553,,D, 3961.80,C, 3300.00,C, 12.54,C, 649.26,
111207, TA554,CCCCC,D, 454.48,C, 380.00,C, 74.48,
091207, TA555,,D, 15.00,C, 12.54,C, 2.46,
111207, TA556,,D, 7893.60,C, 6600.00,C, 1293.60,
081207, TA557,DDDDDDDD,D, 227.24,C, 190.00,C, 37.24,
091207, TA558,,D, 227.24,C, 190.00,C, 37.24,
091207, TA559,,D, 15.00,C, 12.54,C, 2.46,
091207, TA560,,D, 10524.80,C, 8800.00,C, 1724.80,
091207, TA561,,D, 2631.20,C, 2200.00,C, 431.20,
091207, TA562,,D, 2751.18,C, 2200.00,C, 100.32,C, 450.86,
091207, TA563,,D, 5277.40,C, 4400.00,C, 12.54,C, 864.86,
111207, TA564,,D, 2631.20,C, 2200.00,C, 431.20,
111207, TA565,EEEEEEEEEE,D, 2631.20,C, 2200.00,C, 431.20,
111207, TA566,,D, 2631.20,C, 2200.00,C, 431.20,
091207, TA567,FFFFFFFFFF,D, 1315.60,C, 1100.00,C, 215.60,
091207, TA568,,D, 227.24,C, 190.00,C, 37.24,
091207, TA571,,D, 11079.72,C, 8800.00,C, 363.66,C, 100.32,C, 1815.74,
091207, TA572,GGGGGGGGGG,D, 2706.19,C, 2200.00,C, 62.70,C, 443.49,
091207, TA569,HHHHHHHHH,D, 227.24,C, 190.00,C, 37.24,
091207, TA570,IIIIIIIIIIIIII,D, 227.24,C, 190.00,C, 37.24,
111207, TA573,,D, 2751.18,C, 2200.00,C, 100.32,C, 450.86,
111207, TA574,,C, 2631.20,D, 2200.00,D, 431.20,


Le code qui le traite :

$array_fichierE=file($name_file_export); // on ouvre le fichier précédement de sortie en entrée
        foreach($array_fichierE as $ligne) // on parse le fichier ligne par ligne
        {
                $champ=explode(",",$ligne); // on éclate les lignes
                $ht=$champ[6]+$champ[8]+$champ[10]+$champ[12]; // on additionne les valeurs toute les deux colonne à partir de la 6ième jusqu'a la fin
                if ($ht == $champ[4]){ // ht doit être egal à ttc
                        echo "<font color=green>N°: ".$champ[1]." TVA+HT: ".$ht." EST EGAL AU TTC:".$champ[4]."</font><br>";} // un affichage juste pour verif
                else {
                        echo "<font color=red>N°: ".$champ[1]." TVA+HT: ".$ht."  N'EST PAS EGAL AU TTC:".$champ[4]."</font><br>";}
        }


un affichage de verif après traitement du texte:

N°: TA550 TVA+HT: 454.48 EST EGAL AU TTC: 454.48
N°: TA551 TVA+HT: 5502.37 N'EST PAS EGAL AU TTC: 5502.37
N°: TA552 TVA+HT: 5262.4 EST EGAL AU TTC: 5262.40
N°: TA553 TVA+HT: 3961.8 EST EGAL AU TTC: 3961.80
N°: TA554 TVA+HT: 454.48 EST EGAL AU TTC: 454.48
N°: TA555 TVA+HT: 15 EST EGAL AU TTC: 15.00
N°: TA556 TVA+HT: 7893.6 EST EGAL AU TTC: 7893.60
N°: TA557 TVA+HT: 227.24 EST EGAL AU TTC: 227.24
N°: TA558 TVA+HT: 227.24 EST EGAL AU TTC: 227.24
N°: TA559 TVA+HT: 15 EST EGAL AU TTC: 15.00
N°: TA560 TVA+HT: 10524.8 EST EGAL AU TTC: 10524.80
N°: TA561 TVA+HT: 2631.2 EST EGAL AU TTC: 2631.20
N°: TA562 TVA+HT: 2751.18 N'EST PAS EGAL AU TTC: 2751.18
N°: TA563 TVA+HT: 5277.4 EST EGAL AU TTC: 5277.40
N°: TA564 TVA+HT: 2631.2 EST EGAL AU TTC: 2631.20
N°: TA565 TVA+HT: 2631.2 EST EGAL AU TTC: 2631.20
N°: TA566 TVA+HT: 2631.2 EST EGAL AU TTC: 2631.20
N°: TA567 TVA+HT: 1315.6 EST EGAL AU TTC: 1315.60
N°: TA568 TVA+HT: 227.24 EST EGAL AU TTC: 227.24
N°: TA571 TVA+HT: 11079.72 EST EGAL AU TTC: 11079.72
N°: TA572 TVA+HT: 2706.19 N'EST PAS EGAL AU TTC: 2706.19
N°: TA569 TVA+HT: 227.24 EST EGAL AU TTC: 227.24
N°: TA570 TVA+HT: 227.24 EST EGAL AU TTC: 227.24
N°: TA573 TVA+HT: 2751.18 N'EST PAS EGAL AU TTC: 2751.18
N°: TA574 TVA+HT: 2631.2 EST EGAL AU TTC: 2631.20
Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « [PHP][OPERATEUR==][RESULTAT ETRANGE] » dans :
PHP - Les opérateurs Voir Qu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les opérateurs...
Comment récupérer le résultat d'une commande dans une variable VoirComment récupérer le résultat d'une commande dans une variable Préambule Syntaxe Exemples Préambule Il est bien souvent nécessaire de récupérer le résultat d'une commande (ou de son code retour) dans une variable afin de pouvoir...
PHP - Concaténation VoirPHP permet de concaténer des chaînes de caractères grâce à l'opérateur "." : $concatenation= $a . $b; Ou encore pour affecter, dans la variable $a, la valeur de la concaténation de $a et de $b : $a.=$b; Pour concaténer des chaînes et des...
PHP - Structures conditionnelles VoirQu'est-ce qu'une structure conditionnelle? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non, c'est-à-dire si la valeur de son expression vaut 0 ou 1 (le PHP associe le mot clé true à 1...
PHP - Connexion à un annuaire LDAP VoirIntroduction à LDAP PHP permet la connexion et l'envoi de requêtes sur un annuaire LDAP, c'est-à-dire un serveur permettant de stocker des informations de manière hiérarchique. Un serveur LDAP est conçu pour être capable de gérer les opérations...

1

s.spark, le 21 déc 2007 à 04:24:00

Salut,

Très curieux en effet, les 3 1er sont inférieur, et le dernier est supérieur, mais pourquoi, tel est la question !

Répondre à s.spark

2

efflamm, le 21 déc 2007 à 05:15:03

Je me demande s'il faudrait pas que j'ajoute un test de valeur ( !=0 et != "") sur les $champ[6]+$champ[8]+$champ[10]+$champ[12].Pourtant on vois bien sur d'autre ligne que meme si une des valeurs vaut 0 ou " " ça n'a pas l'air de gener PHP, mais bon comme je vois rien d'autre pour l'instant..

Répondre à efflamm

3

s.spark, le 21 déc 2007 à 05:38:54

Pour une raison que j'ignore, dans 2 cas $ht est plus grand de 0,000000000000454747350886 et dans un cas $ht est plus petit de 0,000000000000454747350886 et dans le premier cas $ht est plus grand de 0,000000000000909494701773.
(à 1 virgule près).

Répondre à s.spark

4

efflamm, le 21 déc 2007 à 16:23:41

Est ce qu'on peut dire à php de calculer avec une mantisse à deux chiffre seulement ? :|

Répondre à efflamm

5

s.spark, le 22 déc 2007 à 06:07:07

Essais de mettre tes valeurs dans un intval()

Répondre à s.spark

6

Alain42, le 22 déc 2007 à 15:57:35

Bonjour,

c'est encore moi

$ht=$champ[6]+$champ[8]+$champ[10]+$champ[12]; // on additionne les valeurs toute les deux colonne à partir de la 6ième jusqu'a la fin

dans plusieurs de tes lignes, tu n'as pas autant de champs (12) ?

C'est curieux que Php ne te sorte pas une erreur (index inexistant dans l'array ??)

tu devrais peut être faire une boucle:

$champ=explode(",",$ligne);
$ht=0;// va créer une variable de type numérique
foreach($champ as $cle=>$value){
	if($cle==6 OR $cle==8 OR $cle == 10 OR $cle==12){
	       $ht+=$value;
        }
}


@lain

Répondre à Alain42

7

Alain42, le 22 déc 2007 à 17:24:53

Re,

j'ai fait pleins d'essais, les deux valeurs comparées sont bien numériques et php a un comportement bizarre.

Alors je les force à variable chaine avant comparaison et la ça marche:(les puristes vont bondir !)

$array_fichierE=file('fich_texte.txt'); // on ouvre le fichier précédement de sortie en entrée
        foreach($array_fichierE as $ligne) // on parse le fichier ligne par ligne
        {
                $champ=explode(",",$ligne);
				$ht=0;// va créer une variable de type numérique
				foreach($champ as $cle=>$value){
					if($cle==6 OR $cle==8 OR $cle == 10 OR $cle==12){
						$ht+=trim($value);
					}
				}
				settype($champ[4],'string');// on force le type de variable  en chaine
				settype($ht,'string');
                if ($ht == trim($champ[4])){ // ht doit être egal à ttc
                        echo "<font color='green'>N°: ".$champ[1]." TVA+HT: ".$ht." EST EGAL AU TTC:".$champ[4]."</font><br>";} // un affichage juste pour verif
                else {
                        echo "<font color='red'>N°: ".$champ[1]." TVA+HT: ".$ht."  N'EST PAS EGAL AU TTC:".$champ[4]."</font><br>";}
        }




@lain

Répondre à Alain42

8

efflamm, le 26 déc 2007 à 01:39:17

Je n'aurais pas trouvé comme ça.J'ai testé ça marche ainsi et je peux tout à fait faire évoluer si les lignes changent!

Apparemment dans un tableau (verifié avec intval) si la ou on pointe c'est vide numériquement, c'est pas tout à fait vide quand même puisque intval me retourne 1 dans ces fameuse lignes.Alors que pour moi c'est nul evidemment. Après si la variable est utilisé avec un opérateur comme j'ai fait, sans passer par Mr propre, je ne sais pas ce qui se passe.Php n'aime pas le vide, je dirais ;-)

Un grand merci à vous deux :)

Répondre à efflamm

9

 s.spark, le 26 déc 2007 à 03:02:10

J'avais essayé de mettre des 0 à la place du vide et c'était pareil.

Répondre à s.spark
Collection CommentÇaMarche.net