Saltar al contenido

Cómo validar un código de barras EAN / GTIN en JavaScript

Contamos con tu ayuda para extender nuestras reseñas acerca de las ciencias informáticas.

Solución:

EDITAR También creé un módulo npm, que se puede encontrar en github.

Creé una pequeña biblioteca, que admite EAN8, EAN12, EAN13, EAN14, EAN18, GTIN12, GTIN13 y GTIN14.

Funciona dentro de node.js y todos los navegadores modernos.

barcoder.js:

/*!
 * Barcoder
 * Copyright (c) 2013 mifitto GmbH <[email protected]>
 * MIT Licensed
 */

(function() 

  'use strict';

  /**
   * Library version.
   */

  var version = '1.1.0';

  /**
   * Supported formats
   */

  var minValidLength = 6;
  var maxValidLength = 18;
  var usualValidChars = /^d+$/;

  var formats = 
    'ean8'   :  validChars : /^d+$/, validLength : 8 ,
    'ean12'  :  validChars : /^d+$/, validLength : 12 ,
    'ean13'  :  validChars : /^d+$/, validLength : 13 ,
    'ean14'  :  validChars : /^d+$/, validLength : 14 ,
    'ean18'  :  validChars : /^d+$/, validLength : 18 ,
    'gtin12' :  validChars : /^d+$/, validLength : 12 ,
    'gtin13' :  validChars : /^d+$/, validLength : 13 ,
    'gtin14' :  validChars : /^d+$/, validLength : 14 
  ;

  /**
   * Validates the checksum (Modulo 10)
   * GTIN implementation factor 3
   *
   * @param  String value The barcode to validate
   * @return Boolean
   * @api private
   */

  var validateGtin = function( value ) 

    var barcode = value.substring( 0, value.length - 1 );
    var checksum = parseInt( value.substring( value.length - 1 ), 10 );
    var calcSum = 0;
    var calcChecksum = 0;

    barcode.split('').map(function( number, index ) 
      number = parseInt( number, 10 );
      if ( value.length % 2 === 0 ) 
        index += 1;
      
      if ( index % 2 === 0 ) 
        calcSum += number;
      
      else 
        calcSum += number * 3;
      
    );

    calcSum %= 10;
    calcChecksum = (calcSum === 0) ? 0 : (10 - calcSum);

    if ( calcChecksum !== checksum ) 
      return false;
    

    return true;

  ;

  /**
   * Barcoder class
   *
   * @param string  format    See formats
   * @param Object  options   Valid option `enableZeroPadding`, defaults to `true`
   * @api public
   */

  var Barcoder = function ( format, options ) 

    if ( format && !formats[format] ) throw new Error( '"format" invalid' );

    this.format = (format) ? formats[format] : 'autoSelect';
    this.options = (options) ? options :  enableZeroPadding : true ;

    if ( !this.options.enableZeroPadding ) 
      this.options.enableZeroPadding = true;
    

  ;

  /**
   * Validates a barcode
   *
   * @param  string  barcode   EAN/GTIN barcode
   * @return Boolean
   * @api public
   */

  Barcoder.prototype.validate = function( barcode ) 

    var self = this;

    if ( self.format === 'autoSelect' ) 

    var validChars = self.format.validChars;
    var validLength = self.format.validLength;
    var enableZeroPadding = self.options.enableZeroPadding;

    if ( validChars.exec( barcode ) === null ) 
      return false;
    

    if ( enableZeroPadding && barcode.length < validLength ) 
      var missingZeros = validLength - barcode.length;
      while( missingZeros-- ) 
        barcode = '0' + barcode;
      
    
    else if ( !enableZeroPadding && barcode.length != validLength ) 
      return false;
    
    else if ( barcode.length > validLength ) 
      return false;
    

    return validateGtin( barcode );

  ;

  /**
   * Export
   */

  if ( 'undefined' !== typeof module && module.exports ) 
    module.exports = Barcoder;
    exports.version = version;
  

  if ( 'undefined' === typeof ender ) 
    this['Barcoder'] = Barcoder;
  

  if ( 'function' === typeof define && define.amd ) 
    define('Barcoder', [], function () 
      return Barcoder;
    );
  

).call( this );

Instalación:

$ npm install barcoder

Uso:

var Barcoder = require('barcoder');

var ean1 = '0016T20054453';
var ean2 = '9330071314999';

var validator = new Barcoder('ean13');

console.log( '%s ean1 is valid: %s', ean1, validator.validate( ean1 ) );
console.log( '%s ean2 is valid: %s', ean1, validator.validate( ean2 ) );

// or /w automatic type selection

validator = new Barcoder();

var validation1 = validator.validate( ean1 );
var validation2 = validator.validate( ean2 );

console.log( '%s is valid: %s and has guessed type: %s', ean1, validation1.isValid, validation1.possibleType );
console.log( '%s is valid: %s and has guessed type: %s', ean2, validation2.isValid, validation2.possibleType );

No estoy seguro de por qué, pero la solución de @doms no funcionó correctamente para mí. Tambien me gustaria a los dos calcular nuevos códigos, así como verificar los viejos. Terminé con esto, que he verificado que funciona en mis navegadores al menos:

function eanCheckDigit(s)
    var result = 0;
    for (let counter = s.length-1; counter >=0; counter--)
        result = result + parseInt(s.charAt(counter)) * (1+(2*(counter % 2)));
    
    return (10 - (result % 10)) % 10;

Actualización 2020 – Tuve que agregar let delante del mostrador, de lo contrario, decía que el mostrador no estaba definido.

2020 2da actualización – Después de luchar mucho con esto, me di cuenta de que esta fórmula solo funciona para los UPC pasados ​​que tienen 10 (o incluso dígitos de longitud). Si pasa uno que tiene 11 dígitos, esto no funciona. Así que lo modifiqué para que funcione con cualquier UPC de longitud. Avísame si esto se puede escribir más limpio.

function eanCheckDigit(s)
        let result = 0;
        let i = 1;
        for (let counter = s.length-1; counter >=0; counter--)
            result = result + parseInt(s.charAt(counter)) * (1+(2*(i % 2)));
            i++;
        
        return (10 - (result % 10)) % 10;
    

Aquí hay una versión corta que puede verificar si el dígito de control EAN13 es válido:

  var checkSum = ean.split('').reduce(function(p,v,i) 
    return i % 2 == 0 ? p + 1 * v : p + 3 * v;
    , 0);
  if (checkSum % 10 != 0) 
    alert('error');
  

Si entiendes que te ha sido de ayuda nuestro post, sería de mucha ayuda si lo compartes con más juniors de este modo nos ayudas a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *