Cle RIB et IBAN

Partagez votre expérience de PureBasic avec les autres utilisateurs.
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Cle RIB et IBAN

Message 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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Pour le IBAN alias ISO 13616, en fonction de différents pays, (Merci Wikipedia) :
http://fr.wikipedia.org/wiki/IBAN
LOULOU25
Messages : 150
Inscription : mer. 19/mai/2004 20:40

Message par LOULOU25 »

Progi1984 a écrit :Pour le IBAN alias ISO 13616, en fonction de différents pays, (Merci Wikipedia) :
http://fr.wikipedia.org/wiki/IBAN
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
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Va voir la page de discussion : http://fr.wikipedia.org/wiki/Discuter:ISO_13616
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Cle RIB et IBAN

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Cle RIB et IBAN

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Cle RIB et IBAN

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Cle RIB et IBAN

Message 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.
Image
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Cle RIB et IBAN

Message 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 !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9472
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Cle RIB et IBAN

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Cle RIB et IBAN

Message 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...
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Cle RIB et IBAN

Message 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")

Image
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Cle RIB et IBAN

Message par Micoute »

Bonjour Flype et merci énormément, ton programme est tout simplement génial et bien pratique.

Merci encore infiniment.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Cle RIB et IBAN

Message 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
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Re: Cle RIB et IBAN

Message 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
Image
Répondre