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
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
Se me permite algumas sugestões, eu reescrevi tentando dar umausado em qualquer aplicação Lua.
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
Boa ideia! Nesse caso você vai mudar o nome do módulo?
Posteriormente incluirei outras funções como validação de CNPJ.
Abraço,
Tomás
--
Lua BR - http://groups.google.com/group/lua-br
> 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
ManoelSim, e retornar o índice na string e o caractere capturado.
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
Não, esse código não é muito robusto. Já que você perguntou,este código ele vai descartar quaisquer caracteres não numéricos?
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 :-)