Ir al contenido

European Article Number

De Wikipedia, la enciclopedia libre
(Redirigido desde «EAN»)
Código de barras EAN-13. El primer dígito siempre se sitúa fuera del código. Además, el signoantilambda(>) se utiliza para indicar «zonas en blanco», necesarias para que los escáneres de códigos de barras funcionen correctamente.

Elnúmero de artículo europeo[1][2][3]​ (en inglés European Article Number oEAN) es un sistema decódigos de barrasadoptado 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 comoGS1,con sede en Bélgica.

Estructura y partes

[editar]

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

  • Los primeros dígitos del código de barras EAN identifican el país que otorgó el código, no el país de origen del producto. Por ejemplo, en Chile se encarga de ello una empresa responsable adscrita al sistema EAN y su código es el780.
  • Composición del código:
    • Código del país:en donde radica la empresa, compuesto por tres (3) dígitos.
    • Código de empresa: es un número compuesto por cuatro o cinco dígitos, que identifica al propietario de la marca. Es asignado por la asociación de fabricantes y distribuidores (AECOC).[5]
    • Código de producto: completa los doce primeros dígitos.
    • Dígito de control:para comprobar el dígito de control (por ejemplo, inmediatamente después de leer un código de barras mediante un escáner), numeramos los dígitos de derecha a izquierda. A continuación se suman los dígitos de las posiciones impares, el resultado se multiplica por 3, y se le suman los dígitos de las posiciones pares. Se busca decena inmediatamente superior y se le resta el resultado obtenido. El resultado final es el dígito de control. Si el resultado es múltiplo de 10 el dígito de control será cero (0).

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

  • Numeramos de derecha a izquierda:140987654321
  • Suma de los números en los lugares Impares:1 + 0 + 8 + 6 + 4 + 2 = 21
  • Multiplicado (por 3):21 × 3 = 63
  • Suma de los números en los lugares pares:4 + 9 + 7 + 5 + 3 + 1 = 29
  • Suma total:63 + 29 = 92
  • Decena inmediatamente superior:100
  • Dígito de control:100 - 92 = 8

El código quedará así:1234567890418.

Algoritmo informático

[editar]

Perl

[editar]
# Cálculo del dígito de control EAN
my$ean='750863367001';# Valor de prueba
my$checksum=1000;
my$i=0;

formy$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 inferior

print"Dígito de control: $checksum\n";
print"Código EAN: $ean$checksum\n";

PHP

[editar]
//CálculodeldígitodecontrolEAN
functionean13_checksum($message){
$checksum = 0;
foreach (str_split(strrev($message)) as $pos => $val) {
$checksum += $val * (3 - 2 * ($pos % 2));
}
return ((10 - ($checksum % 10)) % 10);
}

//Valordeprueba(sindígitodecontrol)
$ean='931804231236';
echo'Digitodecontrol:',ean13_checksum($ean);

C#

[editar]
// Cálculo del dígito de control EAN
stringean="123456789012";
intsum=0;
intsumOdd=0;
vardigit=0;

for(inti=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);

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

Python 3

[editar]
EAN="123456789041"

defean_checksum(code:str)->int:
digits=[int(i)foriinreversed(code)]
return(10-(3*sum(digits[0::2])+(sum(digits[1::2]))))%10

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

Python 2

[editar]
EAN="123456789041"

defeanCheck(ean):
checksum=0
fori,digitinenumerate(reversed(ean)):
checksum+=int(digit)*3if(i%2==0)elseint(digit)

return(10-(checksum%10))%10

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

Visual Basic 6.0

[editar]
'Verifica que sea un código EAN válido

FunctionEanValido(ByValEanAsString)AsBoolean
DimSumAsInteger,DigitAsInteger,iAsInteger

Sum=0
Fori=1ToLen(Ean)-1
Digit=Mid(Ean,i,1)
Sum=Sum+Digit*IIf(iMod2=0,3,1)
Next

EanValido=Right(Ean,1)=((10-SumMod10)Mod10)
EndFunction

JavaScript

[editar]
// Cálculo del dígito de control EAN
functionean13_checksum(message){
varchecksum=0;
message=message.split('').reverse();
for(varposinmessage){
checksum+=message[pos]*(3-2*(pos%2));
}
return((10-(checksum%10))%10);
}
// Valor de prueba (sin dígito de control)
varean='123456789041';
console.log(ean13_checksum(ean));

Bash compatible

[editar]
ean13_checksum()
{
localEAN="$1"
localTest=''
localCurDigit=''
localCurReversePos=''
localCurPos=''
localOddSum=''
localEvenSum=''
localTotalSum=''
localUpperTenth=''
localValue=0

Test="$(printf'%s'"$EAN"|sed-e's|[^0123456789]||g')"
if["$EAN"!=""]&&["$Test"="$EAN"];then
CurDigitNr=${#EAN}
CurReversePos=1
while[$CurDigitNr-gt0];do
CurDigit="$(printf'%s'"$EAN"|cut-c${CurDigitNr}-${CurDigitNr})"
if[$((CurReversePos%2))-ne0];then
OddSum=$((OddSum+CurDigit))
else
EvenSum=$((EvenSum+CurDigit))
fi
CurReversePos=$((CurReversePos+1))
CurDigitNr=$((CurDigitNr-1))
done
OddSum=$((OddSum*3))
TotalSum=$((OddSum+EvenSum))
if[${#TotalSum}-eq1];then
UpperTenth=10
else
UpperTenth="$(printf'%s'"$TotalSum"|sed-e's|.$||')"
UpperTenth="$((UpperTenth+1))0 "
fi
Value=$((UpperTenth-TotalSum))
CurPos=${#Value}
echo"$Value"|cut-c${CurPos}-${CurPos}
fi
}

ean13_checksum123456789041

ABAP

[editar]
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

[editar]
// Cálculo del dígito de control EAN
functioncc_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
ifImparthenSI:=SI+StrToInt(Ean[I])elseSP:=SP+StrToInt(Ean[I]);
Impar:=notImpar;
I:=I-1;
untilI=0;
ifImparthenSI:=SI*3elseSP:=SP*3;// Multiplica por tres según la longitud del código
Result:=10-(SI+SP)mod10;// Calcula el dígito de verificación
endelseResult:=-1;
end;

Java

[editar]
/**
* Cálculo del código de control
*/
privateintcontrolCodeCalculator(StringfirstTwelveDigits)
{
char[]charDigits=firstTwelveDigits.toCharArray();
int[]ean13=
{
1,3
};
intsum=0;
for(inti=0;i<charDigits.length;i++)
{
sum+=Character.getNumericValue(charDigits[i])*ean13[i%2];
}
intchecksum=10-sum%10;

if(checksum==10)
checksum=0;

returnchecksum;
}

SQL

[editar]
DECLARE@initialBarcodeVARCHAR(13),@auxBarcodeVARCHAR(13),@finalBarcodeVARCHAR(13)

SET@auxBarcode=REVERSE(@initialBarcode)

DECLARE@verifierCodeINT=0
SELECT
@verifierCode=CASE
WHENi%2=0THEN
@verifierCode+SUBSTRING(@auxBarcode,i,1)
ELSE
@verifierCode+(SUBSTRING(@auxBarcode,i,1)*3)
END
FROMdbo.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

[editar]
ifisnumeric(ean)
ean=sprintf('%013d',ean);
end;
checksum=sum((ean(1:end-1)-'0').*(rem([0:11],2)*2+1));
ifrem(10-(rem(checksum,10)),10)~=ean(13)-'0'
disp('El checksum no parece ser correcto')
end;

Visual FoxPro

[editar]
FUNCTIONDIGITO_VERIFICADOR_EAN
LPARAMETERStcCodigoBarras
LOCALlnSuma, lnI, lnDigito, lnDigitoVerificador

lnSuma= 0

FORlnI =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

[editar]

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

[editar]

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" )
// Se presupone que la variable ean contiene un código EAN válido

charean[13]="123456789041";
char*car=ean+12;
intpar=!0;
intcontrol=0;
intnum;

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

return10-control%10;

Ruby

[editar]
# controlar que el código EAN sea válido

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

Dart

[editar]
// controlar que el código EAN sea válido

booleanValid(Stringcode){
finaldigits=code.split('').map((x)=>int.parse(x)).toList();

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

returndigits.last==(10-sum)%10;
}

Véase también

[editar]

Referencias

[editar]
  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.ISBN978-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

[editar]