Page 1 sur 1
Cle RIB et IBAN
Publié : lun. 03/sept./2007 11:05
par LOULOU25
Voici comment calculer un IBAN de compte bancaire partout dans le monde et une cle rib française
Code : Tout sélectionner
Procedure.s Caliban( compte.s, pays.s)
Protected compte1.s,clerib.s="",clerib1.l,clerib2.l
If pays = "" ;Cas ou l'on fournit seulement le BBAN (RIB) on considére qu'il sagit d'un compte Français par défaut
pays = "FR"
EndIf
;On élimine les blancs et les "-"
compte = ReplaceString(compte, " " ,"")
compte = ReplaceString(compte, "-" ,"")
;Teste si le premier caractére est une lettre auxquelles cas nous sommes en face d'un IBAN
If Asc( Left(compte,1) ) >= 48 And Asc( Left(compte,1) ) <= 59
compte1.s = compte + pays + "FR00"
Else
compte1.s = Mid(compte,5,Len(compte)-4 ) + pays +"00"
EndIf
clerib.s= ""
For i= 1 To Len(compte1)
If Asc(Mid(compte1,i,1)) >= 65 And Asc(Mid(compte1,i,1)) <= 90
clerib = clerib + Str( Asc(Mid(compte1,i,1))-55)
Else
clerib = clerib + Mid(compte1,i,1)
EndIf
Next
clerib1 = ValQ( Left(clerib,19 ) ) % 97
clerib2 =98 -ValQ ( StrQ(clerib1) + Right(clerib,Len(clerib)-19 ) ) % 97
;Teste si le compte a été fourni au format BBAN ou au format IBAN
If Asc( Left(compte,1) ) >= 48 And Asc( Left(compte,1) ) <= 59
ProcedureReturn pays + RSet( Str(clerib2) , 2 , "0") + compte
Else
ProcedureReturn pays + RSet( Str(clerib2) , 2 , "0") + Mid(compte,5,Len(compte)-4)
EndIf
EndProcedure
Procedure.s Clef_rib(bban.s)
;==================
;Calculer la cle rib
;===================
Protected a.s,i.b=1,b.b=1,banque.s,agence.s,rib.s,compte.s,clerib2.s=""
If Len(bban) = 23
banque.s= Left(bban,5)
agence.s = Mid(bban,6,5)
rib.s = Mid(bban,11,11)
Else
banque.s= Mid(bban,5,5)
agence.s = Mid(bban,10,5)
rib.s = Mid(bban,15,11)
EndIf
Protected HOLLERITH.s = "AJ BKSCLTDMUENVFOWGPXHQYIRZ"
;Agence
;===============================
;Calcul de la cle rib
;===============================
For i = 1 To 11
a = Mid(rib, i , 1 )
If Asc(a) >= 65
b = FindString(HOLLERITH,a ,1)
If b % 3 <> 0
b = Int(b / 3) + 1
Else
b = b / 3
EndIf
rib = Left(rib, i - 1) + Str(b) + Right(rib, 11 - i)
EndIf
Next
compte= banque+agence+rib+"00"
clerib1 = ValQ( Left( compte ,19 ) ) % 97
clerib2 = StrQ( 97- ( ValQ( StrQ(clerib1) +Mid( compte,20,4) ) % 97) )
clerib2 = RSet( clerib2,2,"0")
ProcedureReturn Mid(bban,1, Len(BBan)-2)+ clerib2
EndProcedure ;==>Clef_rib
Publié : lun. 03/sept./2007 11:06
par Progi1984
Pour le IBAN alias ISO 13616, en fonction de différents pays, (Merci Wikipedia) :
http://fr.wikipedia.org/wiki/IBAN
Publié : lun. 03/sept./2007 16:30
par LOULOU25
Attention la méthode de calcul présenté dans Wikipedia n'est pas bonne.
La clef se calcul par différence entre 98 et le résulat de la division par 97 (voir mon programme) et celà quelque soit le pays.
La méthode de calcul indiqué pour l'IBAN tient compte du code pays, quelque soit celui-ci la programmation est bonne, ce que je n'ais pas testé est la longueur de l'IBAN qui preut aller de 20 caractéres à 34 caractéres
Publié : mar. 04/sept./2007 8:01
par Progi1984
Re: Cle RIB et IBAN
Publié : sam. 15/févr./2014 16:33
par Ar-S
Je déterre ce sujet car je suis en plein dedans, je cherche à convertir des Rib en Iban+bic
Le code de loulou fonctionne pour tout sauf pour la cléNote (aprés le pays, xx dans FRXX)
Quelqu'un aurai-t-il un code opérationnel ? Ces conversions me cassent la tête.
j'ai vérifiée l'erreur entre le code de Loulou et la calculette de BNP qui je l'espère est juste.
http://migrationsepa.bnpparibas.fr/webapp/calculette.do
Re: Cle RIB et IBAN
Publié : sam. 15/févr./2014 16:49
par Micoute
Bonjour Ar-s, je viens juste d'essayer le lien que tu as mis sur le forum et je confirme que j'ai rentré mon code bancaire et que les numéros IBAN et BIC étaient exacts.
En tous cas pour mon RICE, j'ai essayé aussi avec mon RIP et c'était exact aussi ! Les chiffres après le FR indiquent le numéro de département du siège de la banque.
Bon courage.
Re: Cle RIB et IBAN
Publié : mar. 18/févr./2014 1:32
par Ar-S
Le code de loulou ne fonctionne pas, j'ai décidé de tout reprendre à 0
Mon but étant de convertir un RIB en IBAN + BIC
Je me suis basé pour comprendre sur cette explication assez claire.
* Le RIB
code banque =5 BBBBB
code guichet = 5 AAAAA
numéro de compte = 11 CCCCCCCCCCC
clé rib =2 KK
* L'IBAN est composé des données du RIB (sur 27 caractères)
FRXXBBBBBAAAAACCCCCCCCCCCKK
Les premiers deux caractères sont : FR (code iso2 de la France)
Les 3ème et 4 ème caractères sont : XX (clé)
De 5 à 9 : BBBBB (code banque)
De 10 à 14 AAAAA (code guichet)
De 15 à 25 CCCCCCCCCCC (numéro de compte)
Les 26 et 27 KK (clé rib)
Si le pays de règlement est la France, la clé IBAN doit être calculée selon l'algorythme :
1- code IBAN placer 00 dans le champ clé IBAN FR00BBBBBAAAAACCCCCCCCCCCKK
2- placer les 4 premiers caractères en fin du code BBBBBAAAAACCCCCCCCCCCKKFR00
3- remplacer les lettres par leurs correspondants nombre (A=10, B=11, C=12... Z=35) et donc BBBBBAAAAACCCCCCCCCCCKK152700 (F=15 and R=27)
Toutes les lettres doivent être remplacées
C'est ici que la galère commence
4- Jouer la commande modulo 97 au résultat obtenu
Mod97 = BBBBBAAAAACCCCCCCCCCCKK152700 MODULO 97
5- effectuer la soustraction 98- Mod97 = IBAN key (XX)
6- le code iban répondu est donc : FRXXBBBBBAAAAACCCCCCCCCCCKK
Dis comme ça ça parait chouette mais le modulo d'un compte à plus de 9 chiffres est pas possible en 32bits
Il faut donc fractionner comme ceci.
On prend les 7 premiers chiffres auxquels on applique un %97
BBBBBAA % 97 = 64 par exemple
On place 34 devant les 7 prochains chiffres ce qui donne 34AAACCCC
34AAACCCC % 97 = 44
On continue avec un
24CCCCCCC % 97 = 31
Puis on termine avec
31CCCCKK % 97 = 13
La dernière est censée donner la clé FR13, ce qui ne fonctionne pas dans mon cas.
Le truc c'est que j'ai trouvé plein de méthodes voisines mais qu'aucune n'arrive à me donner satisfaction.
Voilà le code que j'ai pondu.
Code : Tout sélectionner
; Ar-S RIB 2 IBAN
Declare.s ConvertASC_to_IBAN(banque$, guichet$, NumCompte.s,CleRib.s)
Rib.s = "VOTRE RIB ICI"
Rib.s = Trim(Rib)
Rib.s = RemoveString(rib," ")
Structure RIB
Banque.s
Guichet.s
NumCompte.s
CleRIB.s
EndStructure
Global NewList IBAN.RIB()
; Séparation des éléments dans une liste
AddElement ( IBAN() )
IBAN()\Banque = Left(Rib, 5)
Debug "IBAN()\Banque " + IBAN()\banque
StartGuichet = 6
IBAN()\Guichet = Mid(Rib, StartGuichet, 5)
Debug "IBAN()\Guichet : " + IBAN()\Guichet
IBAN()\NumCompte = Mid(Rib, 11, 11)
Debug "IBAN()\NumCompte : " + IBAN()\NumCompte
IBAN()\CleRIB = Right(rib,2)
Debug "CleRIB : " + IBAN()\CleRIB
; test ;-
Compte.s = IBAN()\Banque+IBAN()\Guichet+IBAN()\NumCompte+IBAN()\CleRIB
Debug " C O M P T E : " + Compte
ComptePourCle.s = ConvertASC_to_IBAN (IBAN()\Banque, IBAN()\Guichet, IBAN()\NumCompte,IBAN()\CleRIB)
Procedure.s ConvertASC_to_IBAN(banque$, guichet$, NumCompte.s, Clerib.s)
Protected cle.i, Lpart, NewNum.s
CopyCompte.s = banque$+guichet$+NumCompte.s + clerib.s + "152700" ; "152700 est la conversion de FR00"
CopyCompte = RemoveString(CopyCompte," ")
Lpart = Len(CopyCompte)
Debug CopyCompte
Debug "longueur apres conversion :" + Str(Lpart)
For i = 1 To Lpart
Car.s = Mid(CopyCompte,i,1)
If Asc (car) > 65 And Asc (car) < 91 ; Si c'est une lettre
Debug "Lettre trouvée : " + car + " = Valeur ASCII : " + Str (Asc(car) )
NewNum = Str( Asc(car)-55 )
CopyCompte = ReplaceString(CopyCompte, car, NewNum )
EndIf
Next
Lcompte = Len(CopyCompte)
Debug "Compte modifié pour calcule clé "
Debug " == " + CopyCompte + " ==" ; 2004101007170210122038152700
Debug "Taille : " + Len(CopyCompte)
; V1
ZeDIV = Lcompte / 7
ZeRest = Lcompte % 7
Tot = 0
NewCOUNT.s = "0"
Pos = 0
For i = 0 To ZeDIV
NewCOUNT + Mid (CopyCompte, Pos, 7)
Debug "Fractionement : " + NewCOUNT
B = Val(NewCOUNT) %97
NewCOUNT = Str(B)
Debug "transformé en : " + Str(B)
TEST.s = test+Str(b)
Tot = Tot +B
pos+7
Next
If ZeRest > 0
B = Val( NewCOUNT + Mid (CopyCompte, Pos, ZeRest) ) %97
Tot = tot + B
TEST.s = test+Str(b)
EndIf
Debug "B : " + Str(B)
Debug "Test : " + Test
Cle = 98 - Val(test) %97
; Cle = 98 - Val(tot) %97 ; autre test
Debug "Clé iban : FR" + Str(Cle)
ProcedureReturn CopyCompte.s
EndProcedure
2 jours que je me pète la tête sur ce truc, ça me rend fou.
Je suis sûr que c'est une connerie du à la fraction du grand numéro de compte mais moi et les maths on a toujours été en froid, pourtant j'y met du miens... Bref si quelqu'un voit la pine.
sources que j'ai exploité :
http://fr.wikipedia.org/wiki/Basic_Bank_Account_Number
http://www.cnb.cz/miranda2/export/sites ... EBS204.pdf
y'en a d'autres mais j'ai pas gardé tous les liens
http://fr.wikipedia.org/wiki/ISO_13616
Re: Cle RIB et IBAN
Publié : dim. 03/août/2014 18:52
par Flype
Salut ars,
Es tu toujours embêté avec cette routine ?
Je m'en suis concocté également qui fonctionne nickel si ça t'intéresse toujours.
Re: Cle RIB et IBAN
Publié : dim. 03/août/2014 19:06
par Micoute
Bonjour Flype, qui ne serait pas intéressé par une routine ? En tous cas, pas moi ! Au fait je voudrais te dire que ça me ravi de revoir ton pseudo affiché sur le forum et je crois bien que je ne vais pas être le seul !
Re: Cle RIB et IBAN
Publié : dim. 03/août/2014 19:14
par Ar-S
Flype a écrit :Salut ars,
Es tu toujours embêté avec cette routine ?
Je m'en suis concocté également qui fonctionne nickel si ça t'intéresse toujours.
Salut Flype,
Si tu as du viable, je suis intéressé. J'en ai plus besoin dans l'immédiat mais ça me servira surement plus tard.
Merci et content de te lire
Re: Cle RIB et IBAN
Publié : dim. 03/août/2014 19:31
par Flype
J ai du viable oui car l'algorithme que je me suis fait est sollicité 500 fois par jour sans souci et révisé pour la norme SEPA.
Je comparerai avec le tien...
Re: Cle RIB et IBAN
Publié : lun. 04/août/2014 20:14
par Flype
Voici une réalisation possible (parmi beaucoup d'autres) pour le calcul RIB vers IBAN.
J'ai essayé de décomposer un peu pour aider à la compréhension.
La seule difficulté est le calcul modulo sur un nombre très grand - potentiellement plus grand que 64 bits - d'où la fonction ModBigNum().
On peut vérifier les résultats de cette fonction avec ce site pour se rassurer :
http://www.javascripter.net/math/calcul ... ulator.htm
Mettre dans X : 19915646542145324356841654651432154841201215454121023139999
Mettre dans Y : 97
Cliquer sur le bouton 'mod'
On obtient : 79
Code : Tout sélectionner
Procedure ModBigNum(number.s, modulo)
Protected i, a, b = 1
For i = Len(number) To 1 Step -1
a + b * Val(Mid(number, i, 1))
b % modulo * 10
Next
ProcedureReturn (a % modulo)
EndProcedure
Procedure GetIbanKey(rib.s, country.s)
Protected i
rib = UCase(rib + country) + "00"
For i = 'A' To 'Z'
rib = ReplaceString(rib, Chr(i), Str(i + 10 - 'A'))
Next
ProcedureReturn (98 - ModBigNum(rib, 97))
EndProcedure
Procedure.s RibToIban(rib.s, country.s)
ProcedureReturn UCase(country + RSet(Str(GetIbanKey(rib, country)), 2, "0") + rib)
EndProcedure
; Test Modulo sur un BigNumber
; http://www.javascripter.net/math/calculators/100digitbigintcalculator.htm
Debug ModBigNum("11111222223333333333391152700", 97)
Debug ModBigNum("1111122222101010101010101010101029152700", 97)
Debug ModBigNum("1010101010111111111112121212121212121212121313152700", 97)
Debug ModBigNum("19915646542145324356841654651432154841201215454121023139999", 97)
; Test RIB vers IBAN
; http://marlot.org/util/calcul-de-la-cle-iban.php
Debug RibToIban("11111222223333333333391", "FR")
Debug RibToIban("1111122222AAAAAAAAAAA29", "FR")
Debug RibToIban("AAAAABBBBBCCCCCCCCCCCDD", "FR")
Debug RibToIban("dsfsdfdfdfsdf", "FR")
Re: Cle RIB et IBAN
Publié : mar. 05/août/2014 8:26
par Micoute
Bonjour Flype et merci énormément, ton programme est tout simplement génial et bien pratique.
Merci encore infiniment.
Re: Cle RIB et IBAN
Publié : mar. 05/août/2014 20:09
par Flype
Petite optim,
Vous pouvez remplacer çà :
Code : Tout sélectionner
Procedure ModBigNum(number.s, modulo)
Protected i, a, b = 1
For i = Len(number) To 1 Step -1
a + b * Val(Mid(number, i, 1))
b % modulo * 10
Next
ProcedureReturn (a % modulo)
EndProcedure
par çà - plus propre :
Code : Tout sélectionner
Procedure Mod97(number.s)
Protected i, result, nbcar = Len(number)
For i = 1 To nbcar
result = (result * 10 + Val(Mid(number, i, 1))) % 97
Next
ProcedureReturn result
EndProcedure
Re: Cle RIB et IBAN
Publié : mar. 05/août/2014 22:02
par Flype
et une autre façon de calculer la clef d'un RIB :
Code : Tout sélectionner
Procedure GetRibKey(rib.s)
Protected i, sum.q
rib = UCase(rib)
For i = 'A' To 'I'
ReplaceString(rib, Chr(i), Str(i + 1 - 'A'), 2)
Next
For i = 'J' To 'R'
ReplaceString(rib, Chr(i), Str(i + 1 - 'J'), 2)
Next
For i = 'S' To 'Z'
ReplaceString(rib, Chr(i), Str(i + 2 - 'S'), 2)
Next
sum + (Val(Mid(rib, 1, 5)) * 89)
sum + (Val(Mid(rib, 6, 5)) * 15)
sum + (Val(Mid(rib, 11, 11)) * 3)
ProcedureReturn (97 - (sum % 97))
EndProcedure