-
-
Save joaohcrangel/8bd48bcc40b9db63bef7201143303937 to your computer and use it in GitHub Desktop.
| function isValidCPF(value: string) { | |
| if (typeof value !== 'string') { | |
| return false; | |
| } | |
| value = value.replace(/[^\d]+/g, ''); | |
| if (value.length !== 11 || !!value.match(/(\d)\1{10}/)) { | |
| return false; | |
| } | |
| const values = value.split('').map(el => +el); | |
| const rest = (count) => (values.slice(0, count-12).reduce( (soma, el, index) => (soma + el * (count-index)), 0 )*10) % 11 % 10; | |
| return rest(10) === values[9] && rest(11) === values[10]; | |
| } |
Você está certíssimo! haha
não queria comentar, mas hoje eu tô no humor pra falar, se não gostou faz do seu seu jeito.
Você como programador deveria saber o que é melhor pra sua aplicação (se não tem essa capacidade, seja humilde e pergunte o porque das coisas)... ter alternativas não prejudica em nada a comunidade
Tem gente que parece que quer biscoito 🍪
Precisei dessa função novamente em outro projeto. Só que nele eu tbm precisava da função que gerava o dígito verificador em outros lugares do código. Lá eu transformei ela num método funcional puro e extraí para o mesmo módulo. Apliquei a mesma mudança aqui mas mantive dentro da função para não poluir o escopo.
function isValidCPF(value: string) {
// Se não for string, o CPF é inválido
if (typeof value !== 'string') {
return false;
}
// Remove todos os caracteres que não sejam números
value = value.replace(/[^\d]+/g, '');
// Se o CPF não tem 11 dígitos ou todos os dígitos são repetidos, o CPF é inválido
if (value.length !== 11 || !!value.match(/(\d)\1{10}/)) {
return false;
}
// Transforma de string para number[] com cada dígito sendo um número no array
const digits = value.split('').map(el => +el);
// Função que calcula o dígito verificador de acordo com a fórmula da Receita Federal
function getVerifyingDigit(arr: number[]) {
const reduced = arr.reduce( (sum, digit, index)=>(sum + digit * (arr.length - index + 1)), 0 );
return (reduced * 10) % 11 % 10;
}
// O CPF é válido se, e somente se, os dígitos verificadores estão corretos
return getVerifyingDigit(digits.slice(0, 9)) === digits[9]
&& getVerifyingDigit(digits.slice(0, 10)) === digits[10];
}Há uma falha nessa função. Ela aceita os CPFs 11111111111, 22222222222, ..., 99999999999 como válidos.
Sugestão:
function isValidCPF(cpf) { if (typeof cpf !== "string") return false cpf = cpf.replace(/[\s.-]*/igm, '') if ( !cpf || cpf.length != 11 || cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999" ) { return false } var soma = 0 var resto for (var i = 1; i <= 9; i++) soma = soma + parseInt(cpf.substring(i-1, i)) * (11 - i) resto = (soma * 10) % 11 if ((resto == 10) || (resto == 11)) resto = 0 if (resto != parseInt(cpf.substring(9, 10)) ) return false soma = 0 for (var i = 1; i <= 10; i++) soma = soma + parseInt(cpf.substring(i-1, i)) * (12 - i) resto = (soma * 10) % 11 if ((resto == 10) || (resto == 11)) resto = 0 if (resto != parseInt(cpf.substring(10, 11) ) ) return false return true }
if (/^(\d)\1+$/.test(CPF)) {
return false;
}
Tenho uma sugestão usando paradigma funcional, e um pouco mais reduzido 🤓
function isValidCPF(cpf) { if (typeof cpf !== 'string') return false cpf = cpf.replace(/[^\d]+/g, '') if (cpf.length !== 11 || !!cpf.match(/(\d)\1{10}/)) return false cpf = cpf.split('') const validator = cpf .filter((digit, index, array) => index >= array.length - 2 && digit) .map( el => +el ) const toValidate = pop => cpf .filter((digit, index, array) => index < array.length - pop && digit) .map(el => +el) const rest = (count, pop) => (toValidate(pop) .reduce((soma, el, i) => soma + el * (count - i), 0) * 10) % 11 % 10 return !(rest(10,2) !== validator[0] || rest(11,1) !== validator[1]) }Pra quem quer entender:
function isValidCPF(cpf) { // Validar se é String if (typeof cpf !== 'string') return false // Tirar formatação cpf = cpf.replace(/[^\d]+/g, '') // Validar se tem tamanho 11 ou se é uma sequência de digitos repetidos if (cpf.length !== 11 || !!cpf.match(/(\d)\1{10}/)) return false // String para Array cpf = cpf.split('') const validator = cpf // Pegar os últimos 2 digitos de validação .filter((digit, index, array) => index >= array.length - 2 && digit) // Transformar digitos em números .map( el => +el ) const toValidate = pop => cpf // Pegar Array de items para validar .filter((digit, index, array) => index < array.length - pop && digit) // Transformar digitos em números .map(el => +el) const rest = (count, pop) => (toValidate(pop) // Calcular Soma dos digitos e multiplicar por 10 .reduce((soma, el, i) => soma + el * (count - i), 0) * 10) // Pegar o resto por 11 % 11 // transformar de 10 para 0 % 10 return !(rest(10,2) !== validator[0] || rest(11,1) !== validator[1]) }Esta função já retorna um booleano (verdadeiro ou falso), logo não precisa comparar dentro de um condicional (if)... só chamar a função!
if ( isValidCPF(cpf) ) // só executa se for cpf válidoif ( !isValidCPF(cpf) ) // só executa se não for um cpf válido
Essa foi lendária!
Gente, como q eu uso o documento.elemente by ID com alguma variavel do typebot.