Validar CPF em Lua

218 views
Skip to first unread message

Manoel Campos da Silva Filho

unread,
Feb 18, 2011, 6:42:37 AM2/18/11
to lua...@googlegroups.com
Pessoal, estou disponibilizando um módulo com função para validar CPF em Lua. 
Como não encontrei nada pronto em Lua, resolvi implementar baseado em um exemplo em JavaScript.
Apesar de o artigo do link abaixo focar em TV Digital, o mesmo pode ser usado em qualquer aplicação Lua.

Posteriormente incluirei outras funções como validação de CNPJ.

Espero que seja útil.

Segue link: http://manoelcampos.com/2011/02/14/validando-cpf-em-lua/

--
Manoel Campos da Silva Filho
Mestrando em Engenharia Elétrica - TV Digital - UnB
Professor do Instituto Federal de Educação, Ciência e Tecnologia do Tocantins - IFTO
Analista e Desenvolvedor de Sistemas

http://manoelcampos.com
http://twitter.com/manoelcampos
http://br.linkedin.com/in/manoelcampos

manoelcampos at gmail.com
mcampos at ifto.edu.br
contato at manoelcampos.com

--
Rastreador Automatizado de Encomendas: http://rastreador.manoelcampos.com

Tomas Guisasola Gorham

unread,
Feb 18, 2011, 12:33:37 PM2/18/11
to lua...@googlegroups.com
Oi Manoel

On Fri, 18 Feb 2011, Manoel Campos da Silva Filho wrote:
> Pessoal, estou disponibilizando um m�dulo com fun��o para validar CPF em
> Lua.
> Como n�o encontrei nada pronto em Lua, resolvi implementar baseado em um


> exemplo em JavaScript.
> Apesar de o artigo do link abaixo focar em TV Digital, o mesmo pode ser

> usado em qualquer aplica��o Lua.
Se me permite algumas sugest�es, eu reescrevi tentando dar uma
cara de Lua ao c�digo:

function valid(cpf)
local c = cpf:sub(1,9)
local dv = 0

for i, d in c:gmatch"()(.)" do
dv = dv + tonumber(d)*(11-i)
end
if dv == 0 then
return false
end
dv = 11 - math.fmod(dv, 11) -- equivalente � fun��o mod que voc� implementou
if dv > 9 then
dv = 0
end
if dv ~= tonumber(cpf:sub(10,10)) then
return false
end

dv = dv * 2
for i, d in c:gmatch"()(.)" do
dv = dv + tonumber(d)*(12-i)
end
dv = 11 - math.fmod(dv, 11)
if dv > 9 then
dv = 0
end
return dv == tonumber(cpf:sub(11))
end

> Posteriormente incluirei outras fun��es como valida��o de CNPJ.
Boa ideia! Nesse caso voc� vai mudar o nome do m�dulo?

Abra�o,
Tom�s

Manoel Campos da Silva Filho

unread,
Feb 18, 2011, 12:36:19 PM2/18/11
to lua...@googlegroups.com
Olá Tomas, obrigado.
Sim, após incluir validação de CNPJ e possíveis outras, alterarei o nome do módulo.

Valeu.

2011/2/18 Tomas Guisasola Gorham <to...@tecgraf.puc-rio.br>
       Oi Manoel


On Fri, 18 Feb 2011, Manoel Campos da Silva Filho wrote:
Pessoal, estou disponibilizando um módulo com função para validar CPF em
Lua.
Como não encontrei nada pronto em Lua, resolvi implementar baseado em um

exemplo em JavaScript.
Apesar de o artigo do link abaixo focar em TV Digital, o mesmo pode ser
usado em qualquer aplicação Lua.
       Se me permite algumas sugestões, eu reescrevi tentando dar uma
cara de Lua ao código:


function valid(cpf)
   local c = cpf:sub(1,9)
   local dv = 0

   for i, d in c:gmatch"()(.)" do
       dv = dv + tonumber(d)*(11-i)
   end
   if dv == 0 then
       return false
   end
   dv = 11 - math.fmod(dv, 11) -- equivalente à função mod que você implementou

   if dv > 9 then
       dv = 0
   end
   if dv ~= tonumber(cpf:sub(10,10)) then
       return false
   end

   dv = dv * 2
   for i, d in c:gmatch"()(.)" do
       dv = dv + tonumber(d)*(12-i)
   end
   dv = 11 - math.fmod(dv, 11)
   if dv > 9 then
       dv = 0
   end
   return dv == tonumber(cpf:sub(11))
end


Posteriormente incluirei outras funções como validação de CNPJ.
       Boa ideia!  Nesse caso você vai mudar o nome do módulo?

       Abraço,
               Tomás

--
Lua BR - http://groups.google.com/group/lua-br



--
Manoel Campos da Silva Filho

Manoel Campos da Silva Filho

unread,
Feb 18, 2011, 12:52:27 PM2/18/11
to lua...@googlegroups.com
Só pra eu entender uma coisa:  
c:gmatch"()(.)" vai capturar os dígitos um por um? Pois a versão original considera que o CPF conterá apenas os dígitos (sem ponto e hífen). Ou com este código ele vai descartar quaisquer caracteres não numéricos?

2011/2/18 Manoel Campos da Silva Filho <manoel...@gmail.com>

Tomas Guisasola Gorham

unread,
Feb 18, 2011, 1:59:55 PM2/18/11
to lua...@googlegroups.com
Manoel

> S� pra eu entender uma coisa:
> c:gmatch"()(.)" vai capturar os d�gitos um por um?
Sim, e retornar o �ndice na string e o caractere capturado.

> Pois a vers�o original
> considera que o CPF conter� apenas os d�gitos (sem ponto e h�fen). Ou com
> este c�digo ele vai descartar quaisquer caracteres n�o num�ricos?
N�o, esse c�digo n�o � muito robusto. J� que voc� perguntou,
seria bom validar os par�metros antes de us�-los, para evitar de erros
estranhos acontecer no meio do algoritmo. Para come�ar, seria bom
remover o que n�o � um algarismo. Depois, preencher com zeros no in�cio:

function valid(cpf)
cpf = cpf:gsub("%D", "")
cpf = string.rep("0", 11-cpf:len())..cpf
...

Se voc� quiser ser mais preciosista, pode ainda verificar se o
tipo do par�metro � string, mas isso n�o � muito a cara de Lua :-)

Abra�o,
Tom�s

Manoel Campos da Silva Filho

unread,
Feb 20, 2011, 9:47:37 AM2/20/11
to lua...@googlegroups.com
Tomas, fiz as alterações que sugeriu e também verifiquei se o parâmetro é string, pois sendo numérico, causava erro ao usar as funções do módulo string. Obrigado pelas dicas.

Já inclui função para validar cnpj e alterei o nome do módulo para valid.

Agora usa-se da seguinte forma:

require "valid"

local cpf = "11111111111"
print(cpf, valid.cpf(cpf))

(o anterior também funciona).

2011/2/18 Tomas Guisasola Gorham <to...@tecgraf.puc-rio.br>
       Manoel


Só pra eu entender uma coisa:
c:gmatch"()(.)" vai capturar os dígitos um por um?
       Sim, e retornar o índice na string e o caractere capturado.


Pois a versão original

considera que o CPF conterá apenas os dígitos (sem ponto e hífen). Ou com
este código ele vai descartar quaisquer caracteres não numéricos?
       Não, esse código não é muito robusto.  Já que você perguntou,
seria bom validar os parâmetros antes de usá-los, para evitar de erros
estranhos acontecer no meio do algoritmo.  Para começar, seria bom
remover o que não é um algarismo.  Depois, preencher com zeros no início:


function valid(cpf)
       cpf = cpf:gsub("%D", "")
       cpf = string.rep("0", 11-cpf:len())..cpf
...

       Se você quiser ser mais preciosista, pode ainda verificar se o
tipo do parâmetro é string, mas isso não é muito a cara de Lua :-)


       Abraço,
               Tomás

--
Lua BR - http://groups.google.com/group/lua-br

Manoel Campos da Silva Filho

unread,
Feb 20, 2011, 10:23:09 AM2/20/11
to lua...@googlegroups.com
Ah, o módulo também valida strings contendo datas e horas.

2011/2/20 Manoel Campos da Silva Filho <manoel...@gmail.com>
Reply all
Reply to author
Forward
0 new messages