Test de validité ean13

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 177 fois - Téléchargée 15 fois

Contenu du snippet

Bonjour,

Voici une petite fonction qui permet de calculer l'intégrité d'un code barre EAN13.

Remarque : Les MDDs (Marques De Distributeur) peuvent être reconnues comme invalide.

Pour réaliser cette fonction j'espère avoir bien compris la méthode provenant du site GS1 (voir en bas de page) :

http://www.gs1.org/barcodes/support/check_digit_calculator

Pour la suite, je dois effectuer des tests sur une fonction de décodage poids/prix à partir d'un code barre de supermarché...

Source / Exemple :


Function EAN13_CheckDigit(input:string):Boolean;

Var
X,KeyCalc:integer;
int_extract: Array of integer;

begin
 keycalc:=0;
 setlength(int_extract,length(input));

 For x:=0 to length(input)-1 do
   int_Extract[x]:=strtoint(input[x+1]);

 For x:=0 to length(input)-2 do
   if odd(x) then keycalc:=keycalc+int_extract[x]*3 else
     keycalc:=keycalc+int_extract[x];

 keycalc:=10-(keycalc mod 10);

 if int_extract[12]=keycalc then result:=true else
 result:=false;
end;

Conclusion :


Après divers essais ceci semble fonctionner, veuillez bien lire la remarque sur les MDDs...

Bon coding.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
30
Pas mal, mais ta fonction devrais être complété avec un status bien spécifique pour chaque cas : n'est pas un EAN13, est un EAN13, est un EAN13 strict (clé valide).

voici une possible correction : qui renvois 3 status différent : Invalide (esInvalid), ok EAN13 (esLike), ok EAN13 clé valide (esStrict)

type
TEAN13STATUS = (
esInvalid,
esLike,
esStrict
);

Function EAN13Check(aInput:string): TEAN13STATUS;
Var
X, KeyCalc:integer;
int_extract: array[0..12] of integer;
begin
result := esInvalid;
// Test : longueur = 13 caractères
if length(aInput) <> 13 then
exit;

// Test : tout les caractères sont des chiffres
for X := 1 to 13 do
begin
if not tryStrToInt(aInput[X], int_extract[X-1]) then
exit;
end;

result := esLike;

// calcul de la clé
keycalc := 0;
for x := 0 to 11 do
begin
if (X and 1) = 1 then
keycalc := keycalc + int_extract[x]*3
else
keycalc := keycalc + int_extract[x];
end;
keycalc := 10 - (keycalc mod 10);

// Test : clé valide = EAN13 strict
if int_extract[12] = keycalc then
result := esStrict;
end;
Messages postés
50
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 mai 2009

Bah la tu vois c'est le genre de réponse que j'aime bien ! (ceci dit je garde un réserve quand même) ;-)
Messages postés
13
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
11 novembre 2010

je suis responsable des systèmes d'encaissement pour des supermarchés mais pas système U; mais je peux t'affirmer que tout code barre à 13 chiffres est un ean 13 sauf si c'est un code à 6 ou 8 ou 10 chiffres que tu complètes à 13 chiffres avec des 0 devant, là, la règle n'est pas la même car en fait ce sont des codes UPC que tu transformes en EAN13
Messages postés
50
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 mai 2009

Bonsoir,

Sans certitude de la marque MDD, il me semble que j'ai eu un invalide avec un produit U, ayant bien 13 caractères donc sous forme d'EAN.

Je n'ai pas eu de soucis avec les marques.

Bon coding
Messages postés
13
Date d'inscription
mardi 21 janvier 2003
Statut
Membre
Dernière intervention
11 novembre 2010

Si les marques MDD utilisent des EAN13 ils répondront obligatoirement à la norme sinon ce ne sont pas des EAN , les codes ne feront 13 caractères.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.