4
I am trying to improve the code of @Rui Barradas that is posted here as a response, but it does not work for some situations. After debugging the code, I understand that the problem lies in the function cpf_validar
, since the cpf_dig_controle
works well, even entering 9 digits and, the cpf_gerar
for me is "ok". I have already worked on some lines, but I did not succeed. If someone can give some 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")
The function
cpf_gerar(28806503)
with the first 8 digits of the CPF you use as valid in the last row provides a different CPF than you are using:"288.065.035-07"
. The question now is how do you make sure that the CPF you are using is valid?– Rafael Cunha
Rafael, good morning. I tried to validate my own CPF and my eaposa with the function CPF validate and the answer was FALSE. I did the test of the veesifier digit using its digit checker function for the CPF mentioned above and the digits were entered correctly. Also I did several other tests uaando Cpfs generated by Devs. For this reason I believe that the problwma is in CPF validate function. I tried to adjust it, but the knowledge that poaauo hj was not enough for it to succeed. If you could make a contribution it would be of great value. Thank you
– CARLOS FALCÃO
Carlos, running the functions, I noticed that the checkers digits generated by the function
cpf_dig_controle
are not going to the last two CPF values in functioncpf_gerar
. The first digit after the trace of this function is always0
(at least every time I surround it), so there may be a problem in the functioncpf_gerar
– Rafael Cunha