Modulo

Genjinophil Messages postés 2 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 7 juillet 2006 - 6 juil. 2006 à 18:59
Genjinophil Messages postés 2 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 7 juillet 2006 - 7 juil. 2006 à 15:00
voila je fais une petite fonction  ce verification de rib avec le modulo "%"
mais je comprend pas pourquoi il y a une erreur de calcul !

Voila ma petite fonction ( sans les chiffres )
 //---verif RIB
 $test = 0;
 $numbanq = " ";
 $numgui = " ";
 $numcpt = " ";
 $numcle = 77;


  // Conversion du numero de compte en chiffres
 $pattern = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
 $repl =    array('1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '2', '3', '4', '5', '6', '7', '8', '9', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
$numcpt = str_replace( $pattern, $repl, $numcpt);
$test = $numbanq.$numgui.$numcpt.'00';
$valrib = $test % 97 ;
$valrib = 97 - $valrib;

En fin  de fonction j'obtien :
97 - 65 = 32
au lieu de :
97 - 20 = 77

pourtant j'ai verifié avec une calculette scientifique en utilisant la valeur de $test et le resultat est bon !!

2 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 juil. 2006 à 07:28
Hello,

le problème n'est pas le modulo, mais ton str_replace().
Il fonctionne, avec 2 tableaux, de façons "incrémentale"...Bref, les modifications s'appliquent en temps réel. Il essaye de remplacer la 1ère valeur, puis passe à la seconde...en testant le résultat de la 1ère. Ta chaîne est revérifiée à chaque incrément.
Bon ce n'est pas clair, je te donne un exemple d'un commentaire sur php.net :

<?php
$search = array("one", "two", "three");
$replace = array("two", "three", "one");
$subject = "one two three";
echo str_replace($search, $replace, $subject). "
";
// echoes "one one one"
?>

c'est ce qui se passe dans ton cas.
0
Genjinophil Messages postés 2 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 7 juillet 2006
7 juil. 2006 à 15:00
bonjour
En fait je me suis pris la tete mais finalement j'ai trouvé ma réponse et donc j'en profite pour la donner on sait jamais ca peut être utile

Le serveur PHP ( interne ou sur proxad ) revoit pour pour les nombres d'une taille supérieure  à  1.000.000.000  la formulation scientifique par exemple 3,0004E+13


Et quand on applique le calcul % 97 ou tout autres calcul avec le modulo [ à verifier faut dire que j'ai pas pris le temps pour cela =) ] cela renvois un résultat erroné, donc j'ai applique la solution a l'emporte piece suivante, je donne le code brut dans le plus pur style cobol ou kobold


hop hop de la variable pour agrémenter
$numbanq = "Ma variable";
$numgui = "Ma variable";
$numcpt = "Ma variable";
$numcle = Ma variable;


Je nettoie le compte bancaire, pour ce qui est de ma fonction de remplacement elle fonctionne très bien car je fais en fait , oui je suis paranoïaque =)
//---TOUT METTRE EN MAJ
printf("Mettre tout en MAJ $numcpt
");
$numcpt = strtoupper($numcpt);
printf("Verif Cpt BQ avant $numcpt
");
//---Conversion des lettres du numero de compte en chiffres
$pattern = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
$repl = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '1', '2', '3', '4', '5', '6', '7', '8', '9', '2', '3', '4', '5', '6', '7', '8', '9');
$numcpt = str_replace( $pattern, $repl, $numcpt);
printf("Verif Cpt BQ apres $numcpt
");


Cela me permet de bien verifier que le la conversion a été bonne , et je ne tente pas de remplacer les chiffres par des chiffres


La je hache un peut et je fais des concatenations successives
$valrib = $numbanq % 97;
printf("Calcul 1 = $valrib
");


$valrib = $valrib.$numgui;
printf("CConcat 1 = $valrib
");


$valrib = $valrib % 97;
printf("Calcul 2 = $valrib
");


$numcp1 = substr($numcpt, 0, 5);
printf("Decoup Cpt1 = $numcp1
");


$numcp2 = substr($numcpt, 5, 11);
printf("Decoup Cpt2 = $numcp2
");


$valrib = $valrib.$numcp1;
printf("CConcat 2 = $valrib
");


$valrib = $valrib % 97;
printf("Calcul 3 = $valrib
");


$valrib = $valrib.$numcp2;
printf("CConcat 3 = $valrib
");


$valrib = $valrib % 97;
printf("Calcul 4 = $valrib
");


$valrib = $valrib.'00' ;
printf("CConcat 4 = $valrib
");


$valrib = $valrib % 97;
printf("Calcul 5 = $valrib
");


$valrib = 97 - $valrib;p
rintf("Calcul Final = $valrib
");


une petit verification avant de faire la suite de ce pourquoi cela a été prévus
if ( $valrib == $numcle )
{
printf("Bravo Ma clé RIB est $numcle le calcul donne $valrib");
} else {
printf("PdB un problème la clé RIB est $numcle le calcul donne $valrib");
}


Et la cela fonctionne nickel chrome , bon c'est sur le code est un peu gras, mais je compte de l'alléger en me servant des priorités des opérateurs, tous les affichages sont bien sur à éliminer.


Voilou en espérant que cela serve.
0
Rejoignez-nous