cpf-cnpj-formatter
Version:
A simple formatter for CPF and CNPJ numbers
131 lines • 3.89 kB
JavaScript
/**
* Validates a CPF number
* @param cpf - The CPF number to validate
* @returns ValidationResult object with validation status and error message if invalid
*/
const validateCPF = (cpf) => {
const numbers = cpf.replace(/\D/g, '');
if (numbers.length !== 11) {
return {
isValid: false,
error: 'CPF deve conter 11 dígitos'
};
}
// Check if all digits are the same
if (/^(\d)\1+$/.test(numbers)) {
return {
isValid: false,
error: 'CPF inválido'
};
}
// Validate first digit
let sum = 0;
for (let i = 0; i < 9; i++) {
sum += parseInt(numbers.charAt(i)) * (10 - i);
}
let rest = 11 - (sum % 11);
let digit = rest > 9 ? 0 : rest;
if (digit !== parseInt(numbers.charAt(9))) {
return {
isValid: false,
error: 'CPF inválido'
};
}
// Validate second digit
sum = 0;
for (let i = 0; i < 10; i++) {
sum += parseInt(numbers.charAt(i)) * (11 - i);
}
rest = 11 - (sum % 11);
digit = rest > 9 ? 0 : rest;
if (digit !== parseInt(numbers.charAt(10))) {
return {
isValid: false,
error: 'CPF inválido'
};
}
return { isValid: true };
};
/**
* Validates a CNPJ number
* @param cnpj - The CNPJ number to validate
* @returns ValidationResult object with validation status and error message if invalid
*/
const validateCNPJ = (cnpj) => {
const numbers = cnpj.replace(/\D/g, '');
if (numbers.length !== 14) {
return {
isValid: false,
error: 'CNPJ deve conter 14 dígitos'
};
}
// Check if all digits are the same
if (/^(\d)\1+$/.test(numbers)) {
return {
isValid: false,
error: 'CNPJ inválido'
};
}
// Validate first digit
let size = numbers.length - 2;
let numbersWithoutDigits = numbers.substring(0, size);
const digits = numbers.substring(size);
let sum = 0;
let pos = size - 7;
for (let i = size; i >= 1; i--) {
sum += parseInt(numbersWithoutDigits.charAt(size - i)) * pos--;
if (pos < 2)
pos = 9;
}
let result = sum % 11 < 2 ? 0 : 11 - (sum % 11);
if (result !== parseInt(digits.charAt(0))) {
return {
isValid: false,
error: 'CNPJ inválido'
};
}
// Validate second digit
size = size + 1;
numbersWithoutDigits = numbers.substring(0, size);
sum = 0;
pos = size - 7;
for (let i = size; i >= 1; i--) {
sum += parseInt(numbersWithoutDigits.charAt(size - i)) * pos--;
if (pos < 2)
pos = 9;
}
result = sum % 11 < 2 ? 0 : 11 - (sum % 11);
if (result !== parseInt(digits.charAt(1))) {
return {
isValid: false,
error: 'CNPJ inválido'
};
}
return { isValid: true };
};
/**
* Formats and validates a CPF or CNPJ number
* @param value - The value to format and validate
* @returns An object containing the formatted value and validation result
*/
export const formatCPFCNPJ = (value) => {
const numbers = value.replace(/\D/g, '');
if (numbers.length <= 11) {
const validation = validateCPF(numbers);
const formatted = numbers
.replace(/(\d{3})(\d)/, '$1.$2')
.replace(/(\d{3})(\d)/, '$1.$2')
.replace(/(\d{3})(\d{1,2})$/, '$1-$2');
return { formatted, validation };
}
else {
const validation = validateCNPJ(numbers);
const formatted = numbers
.replace(/(\d{2})(\d)/, '$1.$2')
.replace(/(\d{3})(\d)/, '$1.$2')
.replace(/(\d{3})(\d)/, '$1/$2')
.replace(/(\d{4})(\d{1,2})$/, '$1-$2');
return { formatted, validation };
}
};
//# sourceMappingURL=index.js.map