European Article Number


El número de artículo europeo[1][2][3]​ (en inglés European Article Number o EAN) es un sistema de códigos de barras adoptado por más de cien países y cerca de un millón de empresas.[4]​ En el año 2005, la asociación EAN se fusionó con la UCC para formar una nueva y única organización mundial identificada como GS1, con sede en Bélgica.

Índice

Estructura y partes


El código EAN más usual es EAN-13, constituido por trece (13) dígitos y con una estructura dividida en cuatro partes:

Por ejemplo, para 123456789041 el dígito de control será:

El código quedará así: 1234567890418.

Algoritmo informático


Perl

# Cálculo del dígito de control EAN
my $ean      = '750863367001';             # Valor de prueba
my $checksum = 1000;           
my $i        = 0;for my $digit (split //, reverse $ean) {   # Recorremos el $ean de forma inversa, dígito por dígito
    $checksum                              # Modificamos $checksum
       -= $i++ % 2                         # según la posición del dígito:
        ? $digit                           # posición impar
        : $digit*3                         # posición par
        ;
}$checksum %= 10;                           # Ajustamos a la decena inmediatamente inferiorprint "Dígito de control: $checksum\n";
print "Código EAN: $ean$checksum\n";

PHP

// Cálculo del dígito 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 prueba (sin dígito de control)
$ean = '931804231236';
echo 'Digito de control: ', ean13_checksum($ean);

C#

// Cálculo del dígito de control EAN
string EAN = "123456789012";
int iSum = 0;
int iSumInpar = 0;
var iDigit = 0;for (int i = EAN.Length; i >= 1; i--)
{
 iDigit = Convert.ToInt32(EAN.Substring(i - 1, 1));
 if (i % 2 != 0)
 {
    iSumInpar += iDigit;
 }
 else
 {
    iSum += iDigit;
 }
}iDigit = (iSumInpar) + (iSum * 3) ;int iCheckSum = (10 - (iDigit % 10)) % 10;
Console.Write("Digito de control: " + iCheckSum.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])))) % 10print(f"Dígito de control: {ean_checksum(EAN)}")

Python

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)) % 10print "Digito de control: %d" %eanCheck(EAN)

Visual Basic 6.0

'Cálculo del dígito de control EAN
Dim iSum As Integer
Dim iDigit As Integer
Dim EAN As String
Dim i As Integer
iSum = 0
iDigit = 0
EAN = Text1.Text 'EAN de pruebaFor i = Len(EAN) To 1 Step -1
    iDigit = (Mid(EAN, i, 1))
    If (Len(EAN) - i + 1) Mod 2 <> 0 Then
        iSum = iSum + iDigit * 3
    Else
        iSum = iSum + iDigit
    End If
Next
 
Dim iCheckSum As Integer
iCheckSum = (10 - (iSum Mod 10)) Mod 10
Text2.Text = iCheckSum
Text3.Text = Text1.Text & Text2.Text & "0000000000000"

JavaScript

// Cálculo del dígito 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 prueba (sin dígito de control)
var ean = '123456789041';
console.log(ean13_checksum(ean));

Bash

function ean13_checksum() {
  local EAN="$1"
  test "${EAN//[0-9]*/}" != "" && return 1  local d i=${#EAN}
  CHECKSUM=0
  while test $i -gt 0; do
    let i-=1
    d=${EAN:$i:1}
    test $(($i % 2)) -ne 0 && let d*=3
    let CHECKSUM+=d
  done
  let CHECKSUM=$((10 - (${CHECKSUM} % 10) % 10))
  echo "$CHECKSUM"
}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álculo del dígito de control EAN
function cc_CalcDV_Ean(Ean: String): Integer; 
{ Calcula y devuelve el dígito verificador de una cadena de código EAN13 o EAN8
  Devcuelve -1 en caso de ser incorrecto. }
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 para sumar los valores discriminando posiciones pares e impares
      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 por tres según la longitud del código
    Result:= 10-(SI+SP) mod 10;                // Calcula el dígito de verificación
  end else Result:= -1;
end;

Java

/**
 * Cálculo del código 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 SQLSET @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 parece ser correcto')
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

El ejemplo calcula un EAN13 para la celda A1, si fuera 123456789041 añadiría un 8 como dígito 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

El ejemplo calcula un EAN13 para la celda A6, si fuera 123456789041 añadiría un 8 como dígito 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)
           )
       ;"Deben ser 12 dígitos")
    ;"Deben ser dígitos")

C

// Se presupone que la variable ean contiene un código EAN válidochar ean[13] = "123456789041";
char *car = ean + 12;
int par = !0;
int control = 0;
int num;while(car-- - ean) {
    num = *car - '0';
    if(par) num *= 3;
    par = !par;
    control += num;
}return 10 - control % 10;

Véase también


Referencias


  1. «BOE.es - Documento DOUE-L-2015-82354» . www.boe.es. Consultado el 31 de marzo de 2020. 
  2. Flamarique, Sergi (31 de marzo de 2019). Manual de gestión de almacenes . MARGE BOOKS. ISBN 978-84-17313-84-5. Consultado el 31 de marzo de 2020. 
  3. «Información sobre los identificadores únicos de producto - Ayuda de Manufacturer Center» . support.google.com. Consultado el 31 de marzo de 2020. 
  4. Datos del año 2003.
  5. Diez pasos para implantar el Código de Barras

Enlaces externos











Categorías: Identificadores internacionales | Códigos de barras | Algoritmos de suma de verificación




A partir de: 10.05.2021 09:59:59 CEST

Fuente: Wikipedia (Autores [Historia])    Licencia: CC-by-sa-3.0

Modificaciónes: Se eliminaron todas las imágenes y la mayoría de los elementos de diseño relacionados con ellos. Algunos iconos fueron reemplazados por FontAwesome-Icons. Algunas plantillas se eliminaron (como "el artículo necesita expansión) o se asignaron (como" notas de sombrero "). Las clases CSS fueron eliminadas o armonizadas.
Se eliminaron los enlaces específicos de Wikipedia que no conducen a un artículo o categoría (como "Enlaces rojos", "enlaces a la página de edición", "enlaces a portales"). Cada enlace externo tiene un FontAwesome-Icon adicional. Además de algunos pequeños cambios de diseño, se eliminaron los contenedores de medios, mapas, cuadros de navegación, versiones habladas y Geo-microformatos.

Tenga en cuenta: Debido a que el contenido dado se toma automáticamente de Wikipedia en el momento dado, una verificación manual fue y no es posible. Por lo tanto, LinkFang.org no garantiza la precisión y la actualidad del contenido adquirido. Si hay una información que es incorrecta en este momento o tiene una pantalla incorrecta, no dude en Contáctenos: e-mail.
Ver también: Información legal & Política de privacidad.