1
resposta

Format TelefoneBr

Terminei o modulo de formatação utilizando máscaras.

Repliquei fielmente o codigo da aula, contudo creio que exista um erro no conteúdo.

padrao = '([0-9]{2,3})?([0-9]{2})([0-9]{4,5})([0-9]{4})'

O codigo internacional deve conter entre 1 e 3 digitos.

Deve existir um grupo para contemplar numeros fixos e móveis.

assim ficaria padrao = '([0-9]{2,3})?([0-9]{2})([9])?([0-9]{4})([0-9]{4})'

como o print (máscara) começa a preencher os grupos da esquerda para a direita, ocorrem erros em algumas situações (veja que o 9 é deslocado a esquerda).

                from telefones import TelefonesBr

                telefone = '5537998445678'
                print('telefone:', telefone)

                telefone_objeto = TelefonesBr(telefone)


                print('numero formatado:', telefone_objeto.format_numero())**

        prompt:

        telefone: 5537998445678
        numero formatado: +553(79) None9844-5678

como posso melhorar este codigo?

1 resposta

Olá, Daniel. Tudo bem?

Agradeço pela paciência em aguardar um retorno aqui no fórum.

Parabéns pelo seu código. É muito importante colocar em prática o que aprendemos. Obrigada por compartilhá-lo conosco. :)

Para realizar algumas melhorias no seu código temos que levar em consideração algumas coisas. Atualmente no Brasil os números de celulares possuem 9 dígitos. Já os telefones fixos tem 8 dígitos. Então teremos situações semelhantes aos exemplos a seguir:

  • 55 31 99876 4523 para celulares
  • 55 31 3867 2312 para telefones fixos

Já no cenário internacional alguns telefones podem possuir código de área com 3 dígitos ao invés de 2. Além disso, esses números no caso dos celulares podem ou não ter o nono dígito. Assim teremos também situações parecidas com os exemplos abaixo:

  • 155 61 8712 1919 para celulares
  • 155 45 98726 0987 para celulares
  • 155 62 8123 4621 para telefones fixos

Para abranger todas as situações citadas e corrigir o problema que está ocorrendo no seu código, basta realizarmos uma alteração sutil na Regex padrão disponibilizada pelo instrutor do curso.

Primeiramente, podemos solicitar que o usuário digite o número de telefone utilizando parênteses no DDD, assim resolvemos os casos de saber se o código de área tem 2 ou 3 dígitos.

Na Regex a alteração será de escapar os parênteses no DDD: (\([0-9]{2}\)), para assim pegar o seu valor real e não um grupo de captura.

Um exemplo de código com essa alteração pode ser visto a seguir:

import re

telefone = "55(37)998445678"
padrao = "([0-9]{2,3})?(\([0-9]{2}\))([0-9]{4,5})([0-9]{4})"
resposta = re.search(padrao, telefone)
numero_formatado = "+{}{}{}-{}".format(
            resposta.group(1),resposta.group(2),resposta.group(3),
            resposta.group(4)
)
print(numero_formatado)

O resultado desse código será:

+55(37)99844-5678

O objetivo dessa aula foi dar um aperitivo do poder das expressões regulares. Porém, é importante ressaltar que essa Regex pode ser mais aprimorada para possuir uma validação ainda mais completa. Já que existem casos onde o usuário poderia informar um número em que o DDD ou telefone começasse com 0 ou até mesmo os números 0800.

Assim, caso tenha interesse em se aprofundar mais em expressões regulares deixo como recomendação um curso aqui da Alura sobre Expressões Regulares, onde você entenderá mais sobre o assunto e poderá aprender a criar expressões regulares mais eficientes.

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Agradeço novamente por compartilhar seu código conosco. Lembre-se que você pode sempre contar com o fórum da Alura para tirar suas dúvidas e compartilhar seu desenvolvimento.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software