Sujet: Générer une communication structurée
13/08/2006 @ 15:13:48: rfr: Générer une communication structurée
Pour un petit projet, j'aurais besoin de généré une communication structurée pour des virements bancaire.

Quelqu'un a une idée de l'algorithme ?

Merci!
13/08/2006 @ 15:21:07: zion: Générer une communication structurée
Si ma mémoire est bonne, tu peux mettre ce que tu veux, sauf que les 2 derniers chiffres sont un modulo du reste (par 93 ou 97 je sais plus).

Suffit de trouver 2 communications et le mystère est résolu :grin:
13/08/2006 @ 15:23:16: zion: Générer une communication structurée
Première trouvée: 354/2232/80695
Deuxième: 000/0000/00707
Troisième: 644/0102/39216

Alors, voyons maintenant ce que ca donne
13/08/2006 @ 15:23:43: zion: Générer une communication structurée
Modulo 97 ca roulaize :dawaaa:
13/08/2006 @ 15:34:34: rfr: Générer une communication structurée
J'ai trouvé :wink: Voici l'algorithme, c'est comme pour les comptes bancaires:

communication structurée : 12 pos numériques : 10 + 2 (modulo 97)

si le reste de la division == 00 => remplacer par 97

13/08/2006 @ 15:37:03: zion: Générer une communication structurée
Et je disais quoi moi? :oh:

:tongue:
13/08/2006 @ 16:20:29: rfr: Générer une communication structurée
Merci aussi! :tongue:

Par contre, mon code php pour en générer une ne marche pas :sad: damn, le calcul du modulo n'est pas bon ... Pourtant mon algorithme de check pour le numéros de compte lui fonctionne parfaitement.
13/08/2006 @ 16:30:56: rfr: Générer une communication structurée
des int sur 32 bits ... quelle idée ...
13/08/2006 @ 23:17:26: rfr: Générer une communication structurée
Bon ben au cas ou quelqu'un voudrait sortir la même chose ... voici un code qui fonctionne ...


function generate_structured_communication($transactionID) {

$control = bcmod($transactionID, 97);

$control = ($control == "0") ? "97" : $control;

if ($control < 10) {
$control = "0" . $control;
}

$count = 10 - strlen($transactionID);

for ($i=0; $i < $count; $i++) {
$transactionID = "0" . $transactionID;
}

$com = $transactionID . $control;

return substr($com, 0, 3) . "/" . substr($com, 3, 4) . "/" . substr($com, 7, 5);
}


edit: pour faire plaisir à philfr :ddr555:
14/08/2006 @ 09:02:50: cauet: Générer une communication structurée
Bon ben au cas ou quelqu'un voudrait sortir la même chose ... voici un code qui fonctionne ...


function generate_structured_communication($transactionID) {

$base = (float) $transactionID;

$control = $base - floor($base / 97) * 97;
if ($control == 0) {
$control = 97;
}

$base_s = (string) $base;
$control_s = (string) $control;

if ($control < 10) {
$control_s = "0" . $control_s;
}

$base_len = strlen($base_s);
$count = 10 - $base_len;

for ($i=0; $i < $count; $i++) {
$base_s = "0" . $base_s;
}

$com = $base_s . $control_s;

return substr($com, 0, 3) . "/" . substr($com, 3, 4) . "/" . substr($com, 7, 5);


}



Merci braimmain!
J'allais justement devoir faire ca das les jours à venir..
14/08/2006 @ 09:14:26: philfr: Générer une communication structurée
http://www.php.net/manual/fr/ref.bc.php

Ce ne serait pas plus simpe ?
14/08/2006 @ 09:29:34: cauet: Générer une communication structurée
dans le même genre (pour les chèques)

function convertitNombreEnLettres($nombreAConvertir)
{
$tablePuissancesDeDix = array("", "mille", "millions", "milliards");// ce qu'on affichera apres chaque serie de trois
$tableConversionEtapeDeux = array("", "dix", "vingt", "trente", "quarante", "cinquante", "soixante", "septante", "quatre-vingt", "nonente");// equivalent du second chiffre de la serie de 3 (la dizaine)
$tableConversionEtapeUnOuTrois = array("", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf");// equivalent du premier et du troisieme chiffre de la serie de 3
$tableConversionDeLaDizaineQuiFaitChier = array("", "onze", "douze", "treize", "quatorze", "quinze", "seize");
$nombreAConvertir = number_format($nombreAConvertir);// on formate le nombre "a l'anglaise" avec des virgules entre les milliers
$tableauTemporaire = explode(',', $nombreAConvertir);// on passe les milliers dans un tableau
for($i=0; $i<count($tableauTemporaire); $i++)// on parcourt le tableau, par milliers donc
{
for($j=0; $j<strlen($tableauTemporaire[$i]); $j++)// on parcourt les 3 caracteres (ou moins) du millier en cours
{
switch($j)
{
case strlen($tableauTemporaire[$i])-3://si on est dans les centaines
if(substr($tableauTemporaire[$i], $j, 1) > 0)
{
if(substr($tableauTemporaire[$i], $j, 1) > 1)
echo $tableConversionEtapeUnOuTrois[substr($tableauTemporaire[$i], $j, 1)];
echo " cents ";
}
break;
case strlen($tableauTemporaire[$i])-2:// si on est dans les dizaines
if(substr($tableauTemporaire[$i], $j, 1) > 1)
echo $tableConversionEtapeDeux[substr($tableauTemporaire[$i], $j, 1)];
if(substr($tableauTemporaire[$i], $j, 1) == 1 || substr($tableauTemporaire[$i], $j, 1) == 7 || substr($tableauTemporaire[$i], $j, 1) == 9)
break;
case strlen($tableauTemporaire[$i])-1:// si on est dans les unites
if(substr($tableauTemporaire[$i], $j, 1) == 1)
echo " et ";
if(substr($tableauTemporaire[$i], $j-1, 1) == 1 ||substr($tableauTemporaire[$i], $j-1, 1) == 7 || substr($tableauTemporaire[$i], $j-1, 1) == 9)
if(substr($tableauTemporaire[$i], $j, 1) < 7)
echo "-".$tableConversionDeLaDizaineQuiFaitChier[substr($tableauTemporaire[$i], $j, 1)];
else
echo "-".$tableConversionEtapeUnOuTrois[substr($tableauTemporaire[$i], $j, 1)];
else
echo "-".$tableConversionEtapeUnOuTrois[substr($tableauTemporaire[$i], $j, 1)];
break;
}
}
echo " ".$tablePuissancesDeDix[count($tableauTemporaire)-$i-1]." ";// à quelle multiple de 10^3 on est ?
}
}

convertitNombreEnLettres(124036977);

14/08/2006 @ 11:22:37: rfr: Générer une communication structurée
http://www.php.net/manual/fr/ref.bc.php

Ce ne serait pas plus simpe ?


Voilà philfr, édité ... t'es content :crazy: :whistle:
14/08/2006 @ 13:10:14: philfr: Générer une communication structurée


Voilà philfr, édité ... t'es content :crazy: :whistle:


Passer par des floats pour faire des calculs entiers c'est :vomi:
D'ailleurs tu risques toujours des erreurs d'arrondi.

Même pour les entiers normaux, il y a un opérateur modulo. Tu peux donc remplacer ton code
$control = $base - floor($base / 97) * 97;

par
$control = $base % 97


Et avec un minimum de mathématiques, tu n'as besoin de rien de plus que les entiers 32 bits:

soit le compte aaa-bbbbbbb-XX. La valeur aaabbbbbbb peut d'écrire aaa * 10000000 + bbbbbbb.
Il suffit donc de calculer 10000000%97 = 76 et de faire le calcul

(76*aaa+bbbbbbb)%97 qui passera toujours en 32 bits...

Un exemple ?

123-4567890-XX

76*123+4567890=4577238

4577238 % 97 = 2

Or 1234567890 % 97 = 2

CQFD.
14/08/2006 @ 13:22:01: Keeper: Générer une communication structurée
:prosterne:
14/08/2006 @ 14:41:21: rfr: Générer une communication structurée
sauf que $control = $base % 97 en php tu peux te brosser, ça marche pas j'ai essayé :tongue:
14/08/2006 @ 15:49:40: philfr: Générer une communication structurée
Je fais que lire la doc moi, hein...

Je ne programme pas en PHP, mais l'opérateur modulo existe dans tous les langages dignes de ce nom.

Et pourquoi ça marche pas chez toi ?

Edit:
Chez moi, ça ça marche:

<?php
$a = 1234567890;
echo $a % 97;
?>
14/08/2006 @ 16:16:20: zion: Générer une communication structurée

Je ne programme pas en PHP, mais l'opérateur modulo existe dans tous les langages dignes de ce nom.


Troll poilu :oh:

:neowen:
14/08/2006 @ 16:19:12: rfr: Générer une communication structurée
philfr> je suis un vrai informaticien moi monsieur. Par définition, je suis donc féneiant et adepte de la règle KISS ...

C'est vrai pour les float mais n'ayant trouvé les float et n'étant pas expert en PHP ...
16/08/2006 @ 12:54:37: Bulle: Générer une communication structurée
philfr>
je suis donc féneiant


Mais quelle orthographe ! :wam:

M'étonne qu' H2G2 n'ait pas encore tiqué :smile:

Pour retenir : fainéant < "fait néant", suffit de bouger le 1e "t"
Retour