Bavardages » Générer une communication structurée
Générer une communication structurée
Publié le 13/08/2006 @ 15:13:48,
Par rfrPour 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!
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 zionSi 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
Suffit de trouver 2 communications et le mystère est résolu
Je suis le Roy
Générer une communication structurée
Publié le 13/08/2006 @ 15:23:16,
Par zionPremière trouvée: 354/2232/80695
Deuxième: 000/0000/00707
Troisième: 644/0102/39216
Alors, voyons maintenant ce que ca donne
Deuxième: 000/0000/00707
Troisième: 644/0102/39216
Alors, voyons maintenant ce que ca donne
Je suis le Roy
Générer une communication structurée
Publié le 13/08/2006 @ 15:23:43,
Par zionModulo 97 ca roulaize
Je suis le Roy
Générer une communication structurée
Publié le 13/08/2006 @ 15:34:34,
Par rfrJ'ai trouvé 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
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 zionEt je disais quoi moi?
Je suis le Roy
Générer une communication structurée
Publié le 13/08/2006 @ 16:20:29,
Par rfrMerci aussi!
Par contre, mon code php pour en générer une ne marche pas damn, le calcul du modulo n'est pas bon ... Pourtant mon algorithme de check pour le numéros de compte lui fonctionne parfaitement.
Par contre, mon code php pour en générer une ne marche pas 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 rfrdes 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 rfrBon 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
Dernière édition: 14/08/2006 @ 11:18:27
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
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 cauetBon 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);
}
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
Générer une communication structurée
Publié le 14/08/2006 @ 09:29:34,
Par cauetdans 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);
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 rfrVoilà philfr, édité ... t'es content
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 philfrPasser par des floats pour faire des calculs entiers c'est
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 @ 14:41:21,
Par rfrsauf que $control = $base % 97 en php tu peux te brosser, ça marche pas j'ai essayé
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 philfrJe 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:
Dernière édition: 14/08/2006 @ 16:04:01
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;
?>
$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 zionJe ne programme pas en PHP, mais l'opérateur modulo existe dans tous les langages dignes de ce nom.
Troll poilu
Je suis le Roy
Générer une communication structurée
Publié le 14/08/2006 @ 16:19:12,
Par rfrphilfr> 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 ...
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 BulleMais quelle orthographe !
M'étonne qu' H2G2 n'ait pas encore tiqué
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.