diff --git a/docs/pt-br/utilities.md b/docs/pt-br/utilities.md index b70ec688..42e46102 100644 --- a/docs/pt-br/utilities.md +++ b/docs/pt-br/utilities.md @@ -104,6 +104,19 @@ import { isValidLandlinePhone } from '@brazilian-utils/brazilian-utils'; isValidLandlinePhone('1130000000'); // true ``` +## formatPhone + +Formata no padrão mais comum no Brasil + +```javascript +import { formatPhone } from '@brazilian-utils/brazilian-utils'; + +formatPhone('1188887777'); // (11) 8888-7777 +formatPhone('11988887777'); // (11) 98888-7777 +formatPhone('551188887777'); // +55 (11) 8888-7777 +formatPhone('5511988887777'); // +55 (11) 98888-7777 +``` + ## isValidLicensePlate Valida se a placa de carro é válida. diff --git a/docs/utilities.md b/docs/utilities.md index 050a6dce..43e86044 100644 --- a/docs/utilities.md +++ b/docs/utilities.md @@ -104,6 +104,20 @@ import { isValidLandlinePhone } from '@brazilian-utils/brazilian-utils'; isValidLandlinePhone('1130000000'); // true ``` + +## formatPhone + +Formats in the most common pattern in Brazil + +```javascript +import { formatPhone } from '@brazilian-utils/brazilian-utils'; + +formatPhone('1188887777'); // (11) 8888-7777 +formatPhone('11988887777'); // (11) 98888-7777 +formatPhone('551188887777'); // +55 (11) 8888-7777 +formatPhone('5511988887777'); // +55 (11) 98888-7777 +``` + ## isValidLicensePlate Check if license plate is valid. diff --git a/src/index.test.ts b/src/index.test.ts index 2d1673ef..6d80f411 100644 --- a/src/index.test.ts +++ b/src/index.test.ts @@ -20,6 +20,7 @@ describe('Public API', () => { 'isValidPhone', 'isValidMobilePhone', 'isValidLandlinePhone', + 'formatPhone', 'generateCNPJ', 'formatBoleto', 'isValidBoleto', diff --git a/src/utilities/index.ts b/src/utilities/index.ts index 9b0a61c2..d277f39f 100644 --- a/src/utilities/index.ts +++ b/src/utilities/index.ts @@ -1,6 +1,6 @@ export { isValid as isValidIE } from './inscricao-estadual'; export { isValid as isValidPIS } from './pis'; -export { isValid as isValidPhone, isValidMobilePhone, isValidLandlinePhone } from './phone'; +export { isValid as isValidPhone, format as formatPhone, isValidMobilePhone, isValidLandlinePhone } from './phone'; export { isValid as isValidEmail } from './email'; export { isValid as isValidLicensePlate } from './licensePlate'; export { format as formatPJ } from './processo-juridico'; diff --git a/src/utilities/phone/index.test.ts b/src/utilities/phone/index.test.ts index 6499ef43..cd9bdf87 100644 --- a/src/utilities/phone/index.test.ts +++ b/src/utilities/phone/index.test.ts @@ -2,6 +2,7 @@ import { isValid, isValidMobilePhone, isValidLandlinePhone, + format, VALID_AREA_CODES, PHONE_MIN_LENGTH, PHONE_MAX_LENGTH, @@ -107,3 +108,26 @@ describe('isValid', () => { }); }); }); + +describe('format', () => { + test('should format phone', () => { + expect(format('')).toBe(''); + expect(format('1')).toBe('(1'); + expect(format('11')).toBe('(11) '); + expect(format('119')).toBe('(11) 9'); + expect(format('1198')).toBe('(11) 98'); + expect(format('11988')).toBe('(11) 988'); + expect(format('119888')).toBe('(11) 9888-'); + expect(format('1198888')).toBe('(11) 9888-8'); + expect(format('11988887')).toBe('(11) 9888-87'); + expect(format('119888877')).toBe('(11) 9888-877'); + expect(format('1188887777')).toBe('(11) 8888-7777'); + expect(format('11988887777')).toBe('(11) 98888-7777'); + expect(format('51188887777')).toBe('(51) 18888-7777'); + expect(format('551188887777')).toBe('+55 (11) 8888-7777'); + expect(format('5511988887777')).toBe('+55 (11) 98888-7777'); + expect(format('55119888877776666')).toBe('+55 (11) 98888-77776666'); + expect(format('1188#887AB777')).toBe('(11) 8888-7777'); + expect(format('11988#887AB777')).toBe('(11) 98888-7777'); + }); +}); diff --git a/src/utilities/phone/index.ts b/src/utilities/phone/index.ts index 34c56b0f..3cef11bd 100644 --- a/src/utilities/phone/index.ts +++ b/src/utilities/phone/index.ts @@ -71,3 +71,35 @@ export function isValid(phone: string): boolean { return isValidLength(digits) && isValidFirstNumber(digits) && isValidDDD(digits); } + +export function format(phone: string): string { + const { digits } = parsePhoneDigits(phone); + const hasCountry = digits.length > PHONE_MAX_LENGTH; + + const getHiphenIndex = () => { + if (hasCountry) return digits.length === 12 ? [7] : [8]; + return digits.length === PHONE_MAX_LENGTH ? [6] : [5]; + }; + + const result = digits + .slice(0, digits.length) + .split('') + .reduce((acc, digit, i) => { + const result = `${acc}${digit}`; + + if (hasCountry) { + if ([0].indexOf(i) >= 0) return `+${result}`; + if ([1].indexOf(i) >= 0) return `${result} (`; + if ([3].indexOf(i) >= 0) return `${result}) `; + } else { + if ([0].indexOf(i) >= 0) return `(${result}`; + if ([1].indexOf(i) >= 0) return `${result}) `; + } + + if (getHiphenIndex().indexOf(i) >= 0) return `${result}-`; + + return result; + }, ''); + + return result; +}