Anar al contingut

European Article Number

De L'Enciclopèdia, la wikipedia en valencià
European Article Number
Còdic de barres EAN-13. El primer dígit sempre se situa fòra del còdic. Ademés, el signe antilambda (>) s'utilisa per a indicar «zones en blanc», necessàries per a que els escáneres de còdics de barres funcionen correctament.

El número d'artícul europeu[1][2][3] (en anglés European Article Number o EAN) és un sistema de còdics de barres adoptat per més de cent països i prop d'un milló d'empreses.[4] En l'any 2005, l'associació EAN es va fusionar en la UCC per a formar una nova i única organisació mundial identificada com GS1, en sèu en Bèlgica.

Estructura i parts

El còdic EAN més usual és EAN-13, constituït per tretze (13) dígits i en una estructura dividida en quatre parts:

  • Els primers dígits del còdic de barres EAN identifiquen el país que va otorgar el còdic, no el país d'orige del producte. Per eixemple, en Chile s'encarrega d'això una empresa responsable adscrita al sistema EAN i el seu còdic és el 780.
  • Composició del còdic:
    • Còdic del país: en a on radica l'empresa, compost per tres (3) dígits.
    • Còdic d'empresa: és un número compuesto per quatre o cinc dígits, que identifica al propietari de la marca. És assignat per l'associació de fabricants i distribuïdors (AECOC).[5]
    • Còdic de producte: completa els dotze primers dígits.
    • Dígit de control: per a comprovar el dígit de control (per eixemple, immediatament despuix de llegir un còdic de barres per mig d'un escàner), numerem els dígits de dreta a esquerra. A continuació se sumen els dígits de les posicions impars, el resultat es multiplica per 3, i se li sumen els dígits de les posicions pares. Es busca decena immediatament superior i se li resta el resultat obtingut. El resultat final és el dígit de control. Si el resultat és múltiple de 10 el dígit de control serà zero (0).

Per eixemple, per a 123456789041 el dígit de control serà:

  • Numerem de dreta a esquerra: 140987654321
  • Suma dels números en els llocs Impars: 1 + 0 + 8 + 6 + 4 + 2 = 21
  • Multiplicat (per 3): 21 &claves; 3 = 63
  • Suma dels números en els llocs pares: 4 + 9 + 7 + 5 + 3 + 1 = 29
  • Suma total: 63 + 29 = 92
  • Decena immediatament superior: 100
  • Dígit de control: 100 - 92 = 8

El còdic quedarà aixina: 1234567890418.

Algoritme informàtic

Perl

# Càlcul del dígit de control EAN
my $ean      = '750863367001';             # Valor de prova
my $checksum = 1000;           
my $i        = 0;


for my $digit (split //, reverse $ean) {   # Recorrem el $ean de forma inversa, dígit per dígit
    $checksum                              # Modifiquem $checksum
       -= $i++ % 2                         # segons la posició del dígit:
        ? $digit                           # posició impar
        : $digit*3                         # posició parell
        ;
}

$checksum %= 10;                           # Ajustem a la decena immediatament inferior

print "Dígit de control: $checksum
";
print "Còdic EAN: $ean$checksum
";

PHP

// Càlcul del dígit de control EAN
function ean13_checksum ($message) {
  $checksum = 0;
  foreach (str_split(strrev($message)) as $pos => $val) {
    $checksum += $val * (3 - 2 * ($pos % 2));
  }
  return ((10 - ($checksum % 10)) % 10);
}

// Valor de prova (sense dígit de control)
$ean = '931804231236';
tire 'Digito de control: ', ean13_checksum($ean);

C#

// Càlcul del dígit de control EAN
string ean = "123456789012";
int sum = 0;
int sumOdd = 0;
var digit = 0;

for (int i = ean.Length; i >= 1; i--)
{
    digit = Convert.ToInt32(ean.Substring(i - 1, 1));
    if (i % 2 != 0)
    {
       sumOdd += digit;
    }
    else
    {
       sum += digit;
    }
}

digit = (sumOdd) + (sum * 3);

int checkSum = (10 - (digit % 10)) % 10;
Console.Write("Dígit de control: " + checkSum.ToString());

Python 3

EAN = "123456789041"

def ean_checksum(code: str) -> int:
    digits = [int(i) for i in reversed(code)]
    return (10 - (3 * sum(digits[0::2]) + (sum(digits[1::2])))) % 10

print(f"Dígit de control: {ean_checksum(EAN)}")

Python 2

EAN = "123456789041"

def eanCheck(ean):
    checksum = 0
    for i, digit in enumerate(reversed(ean)):
        checksum += int(digit) * 3 if (i % 2 == 0) else int(digit)
    
    return (10 - (checksum % 10)) % 10

print "Digito de control: %d" %eanCheck(EAN)

Visual Basic 6.0

'Verifica que siga un còdic EAN vàlit

Function EanValido(ByVal Ean As String) As Boolean
    Dim Sum As Integer, Digit As Integer, i As Integer
    
    Sum = 0
    For i = 1 To Len(Ean) - 1
        Digit = Mid(Ean, i, 1)
        Sum = Sum + Digit * IIf(i Mod 2 = 0, 3, 1)
    Next
 
    EanValido = Right(Ean, 1) = ((10 - Sum Mod 10) Mod 10)
End Function

JavaScript

// Càlcul del dígit de control EAN
function ean13_checksum(message) {
    var checksum = 0;
    message = message.split('').reverse();
    for(var pos in message){
        checksum += message[pos] * (3 - 2 * (pos % 2));
    }
    return ((10 - (checksum % 10 )) % 10);
}
// Valor de prova (sense dígit de control)
var ean = '123456789041';
console.log(ean13_checksum(ean));

Bash compatible

ean13_checksum ()
{
	local EAN="$1"
	local Test=''
	local CurDigit=''
	local CurReversePos=''
	local CurPos=''
	local OddSum=''
	local EvenSum=''
	local TotalSum=''
	local UpperTenth=''
	local Value=0
	
	Test="$(printf '%s' "$EAN" | sigau -i 's|[^0123456789]||g')"
	if [ "$EAN" != "" ] && [ "$Test" = "$EAN" ] ; then
		CurDigitNr=${#EAN}
		CurReversePos=1
		while [ $CurDigitNr -gt 0 ] ; do
			CurDigit="$(printf '%s' "$EAN" | cut -c ${CurDigitNr}-${CurDigitNr})"
			if [ $((CurReversePos % 2)) -ne 0 ] ; then
				OddSum=$((OddSum + CurDigit))
			else
				EvenSum=$((EvenSum + CurDigit))
			fi
			CurReversePos=$((CurReversePos + 1))
			CurDigitNr=$((CurDigitNr - 1))
		done
		OddSum=$((OddSum * 3))
		TotalSum=$((OddSum + EvenSum))
		if [ ${TotalSum} -eq 1 ] ; then
			UpperTenth=10
		else
			UpperTenth="$(printf '%s' "$TotalSum" | sigau -i 's|.$||')"
			UpperTenth="$((UpperTenth + 1))0"
		fi
		Value=$((UpperTenth - TotalSum))
		CurPos=${Value}
		tire "$Value" | cut -c ${CurPos}-${CurPos}
	fi
}

ean13_checksum 123456789041

ABAP

CALL FUNCTION 'MARA_EAN11'
         EXPORTING
              P_MATNR      = MARA-MATNR
              P_NUMTP      = MARA-NUMTP
              P_EAN11      = MARA-EAN11
              P_MEINH      = MARA-MEINS
              RET_EAN11    = LMARA-EAN11
              RET_NUMTP    = LMARA-NUMTP
              BINPT_IN     = SY-BINPT
              P_MESSAGE    = ' '
              ERROR_FLAG   = EAN_FEHLERFLG
              P_HERKUNFT   = 'A'         " Für Abmessungen / EAN
              GDS_RELEVANT = MARA-GDS_RELEVANT
         IMPORTING
            P_NUMTP      = MARA-NUMTP
            P_EAN11      = MARA-EAN11
            VB_FLAG_MEAN = RMMG2-VB_MEAN
            MSGID        = MSGID       " s. weiter unten
            MSGTY        = MSGTY
            MSGNO        = MSGNO
            MSGV1        = MSGV1
            MSGV2        = MSGV2
            MSGV3        = MSGV3
            MSGV4        = MSGV4
       TABLES
            MARM_EAN     = MARM_EAN
            MEAN_ME_TAB  = MEAN_ME_TAB " NEU: AHE 24.10.95
          ME_TAB       = ME_TAB
          YDMEAN       = YDMEAN
     EXCEPTIONS
          EAN_ERROR    = 1
          OTHERS       = 2....

Delphi

// Càlcul del dígit de control EAN
function cc_CalcDV_Ean(Ean: String): Integer; 
{ Calcula i torna el dígit verificador d'una cadena de còdic EAN13 o EAN8
  Devcuelve -1 en cas de ser incorrecte. }
var
  SP, SI, I, L:Integer;
  Impar: Boolean;
begin
  L:= Length(Ean);
  if (L=8) or (L=13) then
    begin
    SI:= 0;
    SP:= 0;
    I:= L-1;
    Impar:= Odd(L);
    repeat                                     // Bucle per a sumar els valors discriminant posiciones parells i impar
      if Impar then SI:= SI + StrToInt(Ean[I]) else SP:= SP + StrToInt(Ean[I]);
      Impar:= not Impar;
      I:= I - 1;
    until I =0;
    if Impar then SI:= SI*3 else SP:= SP*3;    // Multiplica per tres segons la llongitut del còdic
    Result:= 10-(SI+SP) mod 10;                // Calcula el dígit de verificació
  end else Result:= -1;
end;

Java

/**
 * Càlcul del còdic de control
 */
private int controlCodeCalculator(String firstTwelveDigits)
{
     char[] charDigits = firstTwelveDigits.toCharArray();
     int[] ean13 =
     {
        1, 3
     };
     int sum = 0;
     for(int i = 0; i < charDigits.length; i++)
     {
         sum += Character.getNumericValue(charDigits[i]) * ean13[i % 2];
     }
     int checksum = 10 - sum % 10;

     if(checksum == 10)
         checksum = 0;

     return checksum;
}

SQL

DECLARE initialBarcode VARCHAR(13), auxBarcode VARCHAR(13), finalBarcode VARCHAR(13)

SET auxBarcode =  REVERSE(initialBarcode)

DECLARE verifierCode INT = 0
SELECT 
	verifierCode = CASE 

WHEN i % 2 = 0 THEN 
			verifierCode + SUBSTRING(auxBarcode, i, 1) 
		ELSE
			verifierCode + (SUBSTRING(auxBarcode, i, 1) * 3)
	END
FROM  dbo.NumbersTable(1,12,1) --- FALTA ESTO EN EL SQL

SET verifierCode = RIGHT((10 - RIGHT(verifierCode,1)),1)

SET finalBarcode = CONCAT(initialBarcode, verifierCode)

RETURN finalBarcode

MATLAB

if isnumeric(ean)
    ean = sprintf('%013d', ean);
end;
checksum = sum((ean(1:end-1)-'0').*(rem([0:11],2)*2+1));
if rem(10 - (rem(checksum,10)), 10) = ean(13)-'0'
    disp('El checksum no sembla ser correcte')
end;

Visual FoxPro

FUNCTION DIGITO_VERIFICADOR_EAN
LPARAMETERS tcCodigoBarras
LOCAL lnSuma, lnI, lnDigito, lnDigitoVerificador
   
  lnSuma = 0
   
  FOR lnI = Len(tcCodigoBarras) TO 1 STEP -1
    lnDigito = Val(Substr(tcCodigoBarras, lnI, 1))
    IF (Mod(Len(tcCodigoBarras) - lnI + 1, 2)) <> 0 THEN
      lnSuma = lnSuma + lnDigito * 3
    ELSE
      lnSuma = lnSuma + lnDigito
    ENDIF
  ENDFOR
   
  lnDigitoVerificador = Mod(10 - Mod(lnSuma, 10), 10)
   
  RETURN (lnDigitoVerificador)
ENDFUNC

Excel

L'eixemple calcula un EAN13 per a la cela A1, si fora 123456789041 afegiria un 8 com a dígit de control

=SI(LARGO(A1)>12;"MAS de 13";SI(ESERROR(A1*1);"NO NUMERICO";CONCATENAR(REPETIR(0;12-LARGO(A1));A1)&RESIDUO((10-(DERECHA(((SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);2;1));"0")+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);4;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);6;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);8;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);10;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);12;1));"0")))*3)+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);1;1));"0")+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);3;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);5;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);7;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);9;1));"0"))+(SI.ERROR(VALOR(EXTRAEB(TEXTO(A1;0);11;1));"0")));1)));10)))

LibreOffice Calc & Google Sheets

L'eixemple calcula un EAN13 per a la cela A6, si fora 123456789041 afegiria un 8 com a dígit de control

=IF(ISNUMBER(VALUE(A6));
    IF(LEN(A6)=12
       ;A6&IF(MOD(
              (MID(A6;2;1)+MID(A6;4;1)+MID(A6;6;1)+

MID(A6;8;1)+MID(A6;10;1)+MID(A6;12;1))*3+
              LEFT(A6;1)+MID(A6;3;1)+MID(A6;5;1)+
              MID(A6;7;1)+MID(A6;9;1)+MID(A6;11;1)
                       ;10)=0;0;10-MOD(
              (MID(A6;2;1)+MID(A6;4;1)+MID(A6;6;1)+
              MID(A6;8;1)+MID(A6;10;1)+MID(A6;12;1))*3+
              LEFT(A6;1)+MID(A6;3;1)+MID(A6;5;1)+
              MID(A6;7;1)+MID(A6;9;1)+MID(A6;11;1)
                       ;10)
           )
       ;"Deuen ser 12 dígits")
    ;"Deuen ser dígits")

C

// Es presupon que la variable ean conté un còdic EAN vàlit

char ean[13] = "123456789041";
char *car = ean + 12;
int parell = !0;
int control = 0;
int num;

while(car-- - ean) {
    num = *car - '0';
    if(parell) num *= 3;
    parell = !parell;
    control += num;
}

return 10 - control % 10;

Ruby

# controlar que el còdic EAN siga vàlit

def ean_valid?(code)
    digits = code.chars.map(&:to_i);
    sum = 0.upto(digits.size-1).sum{|i| digits[i] * (i.odd? ? 3 : 1)}
    digits.last == (10 - sum) % 10 
end

Dart

// controlar que el còdic EAN siga vàlit

bool  eanValid(String code) {
    final digits = code.split('').map((x) => int.parse(x)).toList();

    var sum = 0;
    for (var i = 0; i < digits.length - 1; i++) {
      sum += digits[i] * (i.isOdd ? 3 : 1);
    }

    return digits.last == (10 - sum) % 10;
  }

Vore també

Referències

  1. ↑ «BOE.és - Document DOUE-L-2015-82354». www.boe.es. Consultat el 31 de març de 2020.
  2. ↑ Flamarique, Sergi (31 de març de 2019). Manual de gestió d'almagasens (en es), MARGE BOOKS. ISBN 978-84-17313-84-5. Consultat el 31 de març de 2020.
  3. ↑ «Informació sobre els identificadors únics de producte - Ajuda de Manufacturer Center». support.google.com. Consultat el 31 de març de 2020.
  4. ↑ Senyes de l'any 2003.
  5. ↑ Dèu passos per a implantar el Còdic de Barres


Referències