Validar código EAN/GTIN

15/02/2016

0

Pessoal, tive necessidade esses dias de criar uma rotina que valide códigos GTIN. Como não achei nada parecido, decidi criar a minha própria e postar aqui, caso alguém mais precise. E claro, críticas, correções e sugestões são muito bem vindas!

Obs¹: Pra quem não sabe o código GTIN é o famoso código de barras, também conhecido com EAN. O código GTIN é aceito no SPED se tiver 8, 12, 13 ou 14 posições. Nos meus testes eu utilizei códigos GTIN-13 (maioria no Brasil).
Obs²: É necessário importar o namespace System.Linq para fazer uso das funções "ElementAt" e "Contains".

Segue o código:

public static bool ValidaGTIN(string vGTIN)
{
            //Tamanhos permitidos no GTIN = 8 / 12 / 13 / 14
            int[] GTINlength = { 8, 12, 13, 14 };
            int n, soma, resultado, base10;

            if (!GTINlength.Contains(vGTIN.Length))
            {
                return false;
            }

            //Checa se todos os caracteres do GTIN são números
            for (int i = 0; i <= vGTIN.Length - 1; i++)
            {
                if (!int.TryParse(vGTIN.ElementAt(i).ToString(), out n))
                {
                    return false;
                }
            }

            soma = 0;

            //Se for GTIN-13 multiplica todas as posições pares menos a última por 1 e as ímpares por 3. Nos outros tamanhos, faz o inverso
            if (vGTIN.Length == 13)
            {
                for (int i = 0; i <= vGTIN.Length - 2; i++)
                {
                    if (i % 2 == 0)
                    {
                        soma += (Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 1);
                    }
                    else
                    {
                        soma += (Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 3);
                    }
                }
            }
            else
            {
                for (int i = 0; i <= vGTIN.Length - 2; i++)
                {
                    if (i % 2 == 0)
                    {
                        soma = soma + Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 3;
                    }
                    else
                    {
                        soma = soma + Convert.ToInt32(vGTIN.ElementAt(i).ToString()) * 1;
                    }
                }
            }

            //Procura pelo número de base 10 mais próximo do total somado (arredondando sempre para cima, se necessário)
            base10 = soma;
            if (base10 % 10 != 0)
            {
                while (base10 % 10 != 0)
                {
                    base10 += 1;
                }
            }

            //Diminui o total do número de base 10. O resultado deve ser o último digito do código de barras
            resultado = base10 - soma;
            if (resultado != Convert.ToInt32(vGTIN.ElementAt(vGTIN.Length - 1).ToString()))
            {
                return false;
            }

            return true;
        }
Jonathan Lazaro

Jonathan Lazaro

Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar