Bavardages » Générer une communication structurée
Catégorie:  
   
Générer une communication structurée
Publié le 13/08/2006 @ 15:13:48,
Par rfr
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!
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 13/08/2006 @ 15:21:07,
Par zion
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:
Je suis le Roy :ocube:
   
Générer une communication structurée
Publié le 13/08/2006 @ 15:23:16,
Par zion
Première trouvée: 354/2232/80695
Deuxième: 000/0000/00707
Troisième: 644/0102/39216

Alors, voyons maintenant ce que ca donne
Je suis le Roy :ocube:
   
Générer une communication structurée
Publié le 13/08/2006 @ 15:23:43,
Par zion
Modulo 97 ca roulaize :dawaaa:
Je suis le Roy :ocube:
   
Générer une communication structurée
Publié le 13/08/2006 @ 15:34:34,
Par rfr
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

To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 13/08/2006 @ 15:37:03,
Par zion
Et je disais quoi moi? :oh:

:tongue:
Je suis le Roy :ocube:
   
Générer une communication structurée
Publié le 13/08/2006 @ 16:20:29,
Par rfr
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.
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 13/08/2006 @ 16:30:56,
Par rfr
des int sur 32 bits ... quelle idée ...
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 13/08/2006 @ 23:17:26,
Par rfr
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:

Dernière édition: 14/08/2006 @ 11:18:27
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 14/08/2006 @ 09:02:50,
Par cauet
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..
   
Générer une communication structurée
Publié le 14/08/2006 @ 09:14:26,
Par philfr
http://www.php.net/manual/fr/ref.bc.php

Ce ne serait pas plus simpe ?
   
Générer une communication structurée
Publié le 14/08/2006 @ 09:29:34,
Par cauet
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);

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

Ce ne serait pas plus simpe ?


Voilà philfr, édité ... t'es content :crazy: :whistle:
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 14/08/2006 @ 13:10:14,
Par philfr


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.
   
Générer une communication structurée
Publié le 14/08/2006 @ 13:22:01,
Par Keeper
:prosterne:
   
Générer une communication structurée
Publié le 14/08/2006 @ 14:41:21,
Par rfr
sauf que $control = $base % 97 en php tu peux te brosser, ça marche pas j'ai essayé :tongue:
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 14/08/2006 @ 15:49:40,
Par philfr
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;
?>

Dernière édition: 14/08/2006 @ 16:04:01
   
Générer une communication structurée
Publié le 14/08/2006 @ 16:16:20,
Par zion

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


Troll poilu :oh:

:neowen:
Je suis le Roy :ocube:
   
Générer une communication structurée
Publié le 14/08/2006 @ 16:19:12,
Par rfr
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 ...
To die is a time consuming activity, it often takes a lifetime (but some are faster than others ... though)
   
Générer une communication structurée
Publié le 16/08/2006 @ 12:54:37,
Par Bulle
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"

Dernière édition: 16/08/2006 @ 13:04:43
It's true that we don't know what we've got 'til it's gone, but it's also true that we don't know what we've been missing until it arrives.
Répondre - Catégorie:  
Informaticien.be - © 2002-2024 AkretioSPRL  - Generated via Kelare
The Akretio Network: Akretio - Freedelity - KelCommerce - Votre publicité sur informaticien.be ?