I'm trying to improve the @Rui Barradas code that is posted here as a response, but the same does not work for some situations. After debugging the code, I understand that the problem is in the cpf_validar
function, since cpf_dig_controle
works well, even entering 9 digits and cpf_gerar
is ok for me. I already moved in a few lines, but I did not succeed. If anyone can make any contribution:
# gerar digito de controle a partir de 8 digitos
cpf_dig_controle <- function(y){
v1 <- 0L
v2 <- 0L
z <- as.integer(rev(strsplit(as.character(y), "")[[1]]))
for(i in seq_along(z)){
v1 <- v1 + z[i]*(9 - (i %% 10))
v2 <- v2 + z[i]*(9 - ((i + 1) %% 10))
}
v1 <- (v1 %% 11) %% 10
v2 <- v2 + v1*9
v2 <- (v2 %% 11) %% 10
c(v1, v2)
}
# gerar CPF
cpf_gerar <- function(x){
g <- function(y, v){
z <- strsplit(as.character(y), "")[[1]]
z <- as.integer(c(z, v))
res <- sprintf(fmt = "%d%d%d.%d%d%d.%d%d%d-%02d",
z[1], z[2], z[3], z[4], z[5],
z[6], z[7], z[8], z[9], z[10])
res
}
v <- lapply(x, cpf_dig_controle)
result <- sapply(seq_along(x), function(i) g(x[i], v[[i]]))
result
}
# cpf gerado
cpf <- cpf_gerar(c("01861932", "01234567","12345678","11511611"))
cpf
# validar cpf
cpf_validar <- function(x){
f <- function(y){
z <- unlist(strsplit(y, "\."))
v <- substr(z[3], 3, 6)
v <- as.integer(unlist(strsplit(v, "-")))
z[3] <- substr(z[3], 1, 2)
z <- as.integer(paste(z, collapse = ""))
list(x = z, v = v)
}
result <- lapply(x, f)
valido <- lapply(result, function(r) unlist(lapply(r$x,
cpf_dig_controle)))
valido <- sapply(seq_along(valido), function(i)
result[[i]]$v[1] == valido[[i]][1] & result[[i]]$v[2] == valido[[i]][2]
)
valido
}
#cpfs gerados pela função cpf_dig_controle a partir de 8 digitos
cpf_validar(c("018.619.323-00","012.345.673-02","123.456.786-
02","115.116.111-04"))
#cpf válido, porém a função o qualifica como FALSE
cpf_validar("288.065.030-57")