VitorLuizC / brazilian-values

🇧🇷 Funções de formatação, conversão e validação para valores, documentos e outras unidades usadas no Brasil. Como CEP, CNPJ, CPF, BRL (R$), datas, números etc.
MIT License
541 stars 39 forks source link

what about handling CPF if zero at left? #42

Open sibelius opened 4 years ago

sibelius commented 4 years ago

example

1004218907

image

context.true(isCPF('1004218907'));

isCPF says this is an invalid CPF

sibelius commented 4 years ago

failing test here https://github.com/VitorLuizC/brazilian-values/pull/43

sibelius commented 4 years ago

my current workaround

import { isCPF } from 'brazilian-values';

/**
 * Pattern to match formatted CPF (999.999.999-99) or 11 numbers.
 */
export const CPF_PATTERN = /^(\d{11}|\d{3}\.\d{3}\.\d{3}\-\d{2})$/;

const NonNumeric = /\D/g;

const mapToNumeric = (
  value: string,
): string => value.replace(NonNumeric, '');

const padding = '00000000000';

const leftPad = (str: string) => {
  return padding.substring(0, padding.length - str.length) + str;
}

export const isSafeCPF = (value: string): boolean => {
  if (!CPF_PATTERN.test(value)) {
    const onlyNumeric = mapToNumeric(value);
    const leftPadCpf = leftPad(onlyNumeric);

    return isCPF(leftPadCpf);
  }

  return isCPF(value);
}
mechamobau commented 4 years ago

@sibelius maybe this can be an issue with 4devs validator (or I'm wrong) because the verifier digit returned by validation it's 71 and not 7

sibelius commented 4 years ago

CPF can have less than 11 digits, so the current logic is wrong

Old CPF have less than 11 digits, my father CPF for instance

You need to left pad

sibelius commented 4 years ago

another even smaller CPF example

image

5120101

these are all real CPFs