VBSorcier
Messages postés102Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention29 avril 2007
-
2 juin 2006 à 23:14
frmerle
Messages postés1Date d'inscriptionlundi 25 mai 2009StatutMembreDernière intervention24 novembre 2010
-
24 nov. 2010 à 17:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
frmerle
Messages postés1Date d'inscriptionlundi 25 mai 2009StatutMembreDernière intervention24 novembre 2010 24 nov. 2010 à 17:03
Bonjour et merci pour cette fonction, cependant l'algorithme implémenté est incorrect, il fonctionne pour des codes ISIN français mais pas pour certains ISIN étrangers (américains et anglais en particulier) qui comporte des lettres dans la partie "NSIN" (code national= octet 3 à 11).
C'est pour cela que le code US98157D1063 de CASFLA ne fonctionne pas.
Premier point, l'algorithme à la base de ce contrôle est la formule de LUHN (utilisée aussi pour le contrôle des chiffres clés de carte bleue (cf Wikipédia).
Les principale différences sont les suivantes :
- la lecture doit se faire DE DROITE à GAUCHE (du dernier octet au premier) ce qui explique qu'il y ait une différence pour US98157D1063 puisque le D du 8 ème octet fera qu'il y un chiffre de plus donc pair et impairs sont inversés. De même, pour savoir s'il s'agit d'un impair il faut partir de la fin.
- le chiffre clé doit être pris en compte dans le calcul du modulo
- la somme doit être un multiple de 10
Voici la fonction qui fonctionne dans tous les cas (testée en Vbscript, d'où quelques adaptations sur certaines instructions.
Function isValidIsin(isin)
isin = Trim(isin) 'Retire les espaces
For i = 1 To 12 'Parcours la chaine de caractères, y compris le chiffre de contrôLe
myCar = UCase(Mid(isin, i, 1)) 'Recupere le charactere en Upper
If IsNumeric(myCar) then
myInt = myCar
else
myInt = Asc(myCar) - 55 'Si c'est un alpha, convertion en numeric avec A=10
End If
myCode = myCode & myInt 'Refabrique une chaine de characteres avec les alphas convertis
Next
NbDigits=Len(myCode)
myTotal=Mid(myCode, NbDigits, 1) 'on initialise avec le chiffre clé
For i=NbDigits - 1 To 1 Step -1 'Parcours la nouvelle chaine de droite à gauche en partant de l'avant dernier (le dernier étant le chiffre clé)
If (NbDigits -i) Mod 2 = 0 Then 'si la position du caractère numeric dans la chaine de charactere est Pair en partant de l'avant dernier
myInt = Mid(myCode, i, 1) 'on recupere l'entier
Else 'si la position du charactere numeric dans la chaine de charactere est Impair en partant de l'avant dernier
myInt = Mid(myCode, i, 1) * 2 'on multiplie par 2 l'entier
'si l'entier est plus grand que 9, on additionne le chiffre des dizaines au chiffre des unités , ce qui revient à soustraire 9
'plus simple que : myInt = CInt(Mid(myInt, 1, 1)) + CInt(Mid(myInt, 2, 1))
If myInt > 9 Then myInt = myInt - 9
End If
myTotal = myTotal + myInt 'on fait le total des entiers
Next
'si le code Isin est bien formé c'est un multiple de 10 donc le modulo 10 = 0
checkDigit_calculated = myTotal Mod 10
If (checkDigit_calculated=0) Then
isValidIsin = true
else
isValidIsin= False
end if
End Function
casfla
Messages postés1Date d'inscriptionmercredi 12 avril 2006StatutMembreDernière intervention28 novembre 2006 28 nov. 2006 à 15:54
Bonjour,
le code ISIN suivant US98157D1063 existe bien, mais n'est pas détecté comme valide par la fonction.
(j'ai l'impression que c'est une histoire de modulo 10 au niveau de la ligne :
If (checkDigit 10 - (myTotal Mod 10)) Then isValidIsin True
à modifier en :
If (checkDigit (10 - (myTotal Mod 10)) mod 10) Then isValidIsin True
??
cs_kouke
Messages postés8Date d'inscriptionlundi 26 mai 2003StatutMembreDernière intervention12 février 2007 22 juil. 2006 à 17:41
Salut tt le monde,
Merci bcp Guillaume1er pour cette fonction, c trés utile pour moi.
Je l'ai utilisé sous "Excel XP" est ça marche trés bien pour verifier la validité d'un ISIN dans une colonne avant de lancer une requet Web sur le site
http://fr.moneycentral.msn.com/investor/quotes/quotes.asp?Symbol= "Votre ISIN"
pour récupérer des valeurs de la bourse .
merci mille fois.
cs_Guillaume1er
Messages postés8Date d'inscriptionmardi 17 décembre 2002StatutMembreDernière intervention 3 juin 2006 3 juin 2006 à 12:26
Un code Isin c'est un code identifiant un OPCVM (Ce sont des produits financiers).Ce la facilite l'identification des valeurs Mobilieres.
voici un exemple de Code Isin : FR0000130007
Pour plus d'infos :
http://www.edubourse.com/guide/fiche.php?idFiche=258
VBSorcier
Messages postés102Date d'inscriptionjeudi 31 mars 2005StatutMembreDernière intervention29 avril 2007 2 juin 2006 à 23:14
c'est quoi le code isin, ca ressemble à quoi ?? un ptit exemple !!
24 nov. 2010 à 17:03
C'est pour cela que le code US98157D1063 de CASFLA ne fonctionne pas.
Premier point, l'algorithme à la base de ce contrôle est la formule de LUHN (utilisée aussi pour le contrôle des chiffres clés de carte bleue (cf Wikipédia).
Les principale différences sont les suivantes :
- la lecture doit se faire DE DROITE à GAUCHE (du dernier octet au premier) ce qui explique qu'il y ait une différence pour US98157D1063 puisque le D du 8 ème octet fera qu'il y un chiffre de plus donc pair et impairs sont inversés. De même, pour savoir s'il s'agit d'un impair il faut partir de la fin.
- le chiffre clé doit être pris en compte dans le calcul du modulo
- la somme doit être un multiple de 10
Voici la fonction qui fonctionne dans tous les cas (testée en Vbscript, d'où quelques adaptations sur certaines instructions.
Function isValidIsin(isin)
isin = Trim(isin) 'Retire les espaces
For i = 1 To 12 'Parcours la chaine de caractères, y compris le chiffre de contrôLe
myCar = UCase(Mid(isin, i, 1)) 'Recupere le charactere en Upper
If IsNumeric(myCar) then
myInt = myCar
else
myInt = Asc(myCar) - 55 'Si c'est un alpha, convertion en numeric avec A=10
End If
myCode = myCode & myInt 'Refabrique une chaine de characteres avec les alphas convertis
Next
NbDigits=Len(myCode)
myTotal=Mid(myCode, NbDigits, 1) 'on initialise avec le chiffre clé
For i=NbDigits - 1 To 1 Step -1 'Parcours la nouvelle chaine de droite à gauche en partant de l'avant dernier (le dernier étant le chiffre clé)
If (NbDigits -i) Mod 2 = 0 Then 'si la position du caractère numeric dans la chaine de charactere est Pair en partant de l'avant dernier
myInt = Mid(myCode, i, 1) 'on recupere l'entier
Else 'si la position du charactere numeric dans la chaine de charactere est Impair en partant de l'avant dernier
myInt = Mid(myCode, i, 1) * 2 'on multiplie par 2 l'entier
'si l'entier est plus grand que 9, on additionne le chiffre des dizaines au chiffre des unités , ce qui revient à soustraire 9
'plus simple que : myInt = CInt(Mid(myInt, 1, 1)) + CInt(Mid(myInt, 2, 1))
If myInt > 9 Then myInt = myInt - 9
End If
myTotal = myTotal + myInt 'on fait le total des entiers
Next
'si le code Isin est bien formé c'est un multiple de 10 donc le modulo 10 = 0
checkDigit_calculated = myTotal Mod 10
If (checkDigit_calculated=0) Then
isValidIsin = true
else
isValidIsin= False
end if
End Function
28 nov. 2006 à 15:54
le code ISIN suivant US98157D1063 existe bien, mais n'est pas détecté comme valide par la fonction.
(j'ai l'impression que c'est une histoire de modulo 10 au niveau de la ligne :
If (checkDigit 10 - (myTotal Mod 10)) Then isValidIsin True
à modifier en :
If (checkDigit (10 - (myTotal Mod 10)) mod 10) Then isValidIsin True
??
22 juil. 2006 à 17:41
Merci bcp Guillaume1er pour cette fonction, c trés utile pour moi.
Je l'ai utilisé sous "Excel XP" est ça marche trés bien pour verifier la validité d'un ISIN dans une colonne avant de lancer une requet Web sur le site
http://fr.moneycentral.msn.com/investor/quotes/quotes.asp?Symbol= "Votre ISIN"
pour récupérer des valeurs de la bourse .
merci mille fois.
3 juin 2006 à 12:26
voici un exemple de Code Isin : FR0000130007
Pour plus d'infos :
http://www.edubourse.com/guide/fiche.php?idFiche=258
2 juin 2006 à 23:14