16 de novembro
Alta procura
91 visualizações

Validação e Máscara Decimal usando Expressões Regulares

Expressões Regulares estão presentes no nosso sofware, ainda que não as vejamos, as funções que chamamos acabam passando por filtros RegExp na fase onde o código é transformado para algo mais próximo da linguagem de máquina, seja qual for sua linguagem de programação.

REGEXP… nome estranho, dá medo mesmo. Eu tinha muito medo, e hoje me pergunto porque esperei quatro anos pra parar e realmente entender a razão porque existe e sua utilidade. Um dia eu cansei de enrolar e resolvi pegar realmente. É possível dominar RegExp em uma semana ou menos.

Você fala inglês? Aprendeu por conta ou fez um curso? Assim como você entendeu a necessidade do inglês na programação, também precisa dominar RegExp. Isso vai elevar sua habilidade de programação e tornar seus códigos mais enxutos e eficientes.

Utilizamos Expressões Regulares para encontrar padrões em textos e então poder operar sobre esses padrões encontrados. Podemos encontrar padrões com procuradores gulosos – que examinam da primeira até a última ocorrência do padrão – ou preguiçosos (?) – que dão a análise por encerrada na primeira ocorrência do padrão.

Utilizamos text.match(regex) – método para teste de strings contra um regex, usando os localizadores disponíveis:
. – qualquer caractér naquela posição
? – o caractér anterior é opcional ? – sinaliza um procurador preguiçoso
[abc] – permite apenas um dos caractéres declarados a, b ou c
[^abc] – bloqueia o uso de qualquer um dos três caractéres
[a-z] – demarcam espaço para letras
[0-9](ou \d) – demarcam espaço para númerais
[^0-9](ou \D) – demarcam espaço para não-numerais
\w != \W – Word (Palavra), ou não
\s != \S – espaço, ou não
+ e * – repete o caractér anterior, ou o set de regex uma ou mais vezes
{x} – número exato de repetições
{x,y} – para variar o número de repetições
() – grupos : coletam o texto encontrado pelos padrões definidos dentro de seu campo. Os grupos podem ser referenciados por número de índice posteriormente, $1, $2 …

Um listener de eventos como onChange deve ser usado para aplicar as funções mask_decimal( event.target ) e validate_decimal( event.target ) como veremos a seguir.

Vejamos um exemplo prático em JavaScript (ECMA Script) de máscara e validação para números decimais, ambos usando RegExp. A seguinte função pode ser aplicada no evento onChange de cada campo desejado. É uma função que formata o valor digitado cada vez que ele é modificado.

export function mask_decimal(input){

    if(typeof input === "undefined" || input == null)
    return 0;
  
    let valor = '';
  
    if(typeof input.value !== "undefined"){
      valor = input.value;
    } else {
      valor = input;
    }
  
    if(valor.length <=2)
    return valor;
  
      let v = valor;
       v = v.replace(/\D/g, '');
      v = v.replace(/(\d{1,2})$/, ',$1');
     v = v.replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1.');
   return v;
  
  }

v.replace(/(\d{1,2})$/, ‘,$1’);

Explicação: Simples. Identifique a string que termine com dois caractéres ($). Insira uma vírgula logo antes.

/(\d)(?=(\d{3})+(?!\d))/g

Explicação: Retorne pra mim, todas as ocorrências na string fornecida. Quero qualquer ocorrência de um único número, seguido de três números exatamente, sem outros números após. Isso é necessário para pegar as unidades de milhar.

Criamos então a validação. Queremos a precisão de dois números após a vírgula, que é nosso padrão brasileiro. Retorne true se validar. Caso contrário, retorne false.

export function validate_decimal(input){

  if(typeof input == "undefined" || input == null)
  return 0;

  let valor = '';

  if(typeof input.value !== "undefined"){
    valor = input.value;
  } else {
    valor = input;
  }

  if(valor.length <= 2){
    return true;
  }

  var re = /(\d{1,3}\.)*([\d]{2,3}\,)*(\d{2})/;

return re.test(valor);
}

Repare a utilização de .replace na máscara e .test na validação.

Ferramentas web úteis para testes

RegexOne é um site bolado pra você pegar as manhas e entender de vez cada caractér quando ver uma expressão regular da próxima vez. Você também vai passar a escrever suas próprias expressões com tanta facilidade quanto programa sua linguagem.

Vai lá no RegexOne e aprende RegExp

Teste & debug para PHP, Python e Javascript

Uma segunda opção, também muito boa, com exemplos

Conclusão

Percebemos que existem verificações para saber se o valor está vazio e também percebemos aplicações consecutivas de diferentes padrões RegExp, como vimos nos .replace consecutivos sobre o mesmo valor. O que é retornado, fica visível novamente no campo em questão de milissegundos, criando a validação e a máscara em tempo real.

Complementar, contribuir, comentar!

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *


Um pouco sobre o autor

Matteus Barbosa - Desenvolvedor Web
                               
Trabalho como Desenvolvedor web desde 2013 e atualmente faço parte do quadro da Symplicity. Também atuo em projetos como profissional autônomo. Para saber da minha experiência, acesse meu Currículo, meu Portfólio, a relação de Referências de Clientes ou ainda a Lista de Serviços. As propostas de serviço são iniciadas com conversas informais, seguidas da coleta de requisitos, elaboração do cronograma e por fim a proposta de orçamento. Todas as etapas são acompanhados de perto via ferramenta online e videoconferências. Os pagamentos são registrados com entrega de notas fiscais. Presto serviços de projeto, desenvolvimento e manutenção de sistemas baseados nos mais diversos frameworks.