Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Input q só deve receber inteiros positivos e negativos

Olá,

Estou fazendo uma máscara para q só sejam aceitos números inteiros positivos e negativos. Consegui chegar à seguinte solução em JavaScript. Mas será q há um forma mais simples, com apenas uma RegEx?

function moeda(v) {
            if(v.length == 1){
                v = v.replace(/[^-0-9]/g, ""); //primeiro caractere deve ser hífen ou números
            }else if(v.length == 2){
                v = v.replace(/[^0-9]$/g, ""); //segundo caractere só pode ser número
            }else if(v.length >= 3){
                v = v.replace(/(([^0-9].)|([^0-9]))$/g, ""); //adicionado para caso o usuário pressione duas teclas ao mesmo tempo e uma delas não seja número
            }
            return v;
        }

Obrigado.

8 respostas

Olá, Jonas, tudo bem?

Qual seria o tipo de input só para eu tentar aqui com alguns testes? Se possível, um exemplo de cada um.

Sei que é possível indicar quantidade de caracteres com o {qtdeInicial, qtdeFinal}. Por exemplo:

  • {2,} = A partir de dois caracteres
  • {2, 5} = De 2 a 5

Talvez este seja o caminho.

Abraço,

Bom dia, Rafael.

Tudo bem, e você?

Só são permitidos inteiros positivos e negativos. Ex.: 298, -136 etc

O que não pode aceitar: Ex.: a, 12-, 38-8, 5& etc

Abraço

Será que este aqui dá certo?

/(^-|^\d)|\d+/g

Esta seleciona os números somente, sendo que na primeira pode ou não haver o hífen.

Seria isso?

Infelizmente não. Eu estou usando a função replace. Então, conforme o usuário digita, ela deve verificar a string e substituir tudo q for diferente de número ou hífen na primeira posição e tudo q for diferente de número nas demais posições por uma string vazia.

Se eu quisesse apenas números, seria fácil. Eu poderia fazer:

function inteirosPositivos(v) {
            v = v.replace(/\D/g, "") // seleciona tudo q não for dígito e substitui por ""
            return v;
        } 

O problema é pertimir o hífen só na primeira posição e não nas demais. Eu teria q pegar o hífen apenas a partir da segunda ocorrência encontrada para substituí-lo por "".

Jonas,

Tô pensando aqui em como inverter essa minha sugestão. Não sei se o uso do replace é mesmo obrigatório. Caso não seja, você poderia extrair os números e transformar em uma outra string.

Por exemplo:

let num1 = '-1023-234&834';

let regExp = /(^-|^\d)|\d+/g;

function somenteNumeros(string) {
    return string.match(regExp).join('');
}

somenteNumeros(num1);

Ainda dá pra converter para número, se for o caso:

function somenteNumeros(string) {
    return Number(string.match(regExp).join(''));
}

Desculpe se ainda não for isso, estou tentando aqui, mas também sou aluno, então já viu... Hehe...

Abraço!

Rafael,

Desculpa a demora em responder.

Eu acho q essa solução também não me atende. Mas fica tranquilo, mano. Valeu pela ajuda!

Abraço

Jonas,

Passa como solucionou aí depois. Queria aprender também. É sempre útil!

Desculpe! =(

Abraço,

solução!

Rafael,

Eu estou usando JSF (Java Server Faces).

<h:inputText value="#acompanhamentoAlertaIncluirBean.viewHelper.filtro.quantidadeDiasDe}"size="10" 
onkeypress="mascara(this, inteirosPositivosNegativos)" onkeyup="mascara(this, inteirosPositivosNegativos)" onblur="mascara(this, inteirosPositivosNegativos)" />
function mascara(o, f) {
            v_obj = o
            v_fun = f
            setTimeout("execmascara()", 1)
        }
        function execmascara() {
            v_obj.value = v_fun(v_obj.value)
        }

        function inteirosPositivosNegativos(v) {
            if(v.length == 1){
                v = v.replace(/[^-0-9]/g, "");//primeiro caractere deve ser hífen ou números
            }else if(v.length == 2){
                v = v.replace(/[^0-9]$/g, "");//segundo caractere só pode ser número
            }else if(v.length >= 3){
                v = v.replace(/(([^0-9].)|([^0-9]))$/g, "");//adicionado para caso o usuário pressione duas teclas ao mesmo tempo e uma delas não seja número
                v = v.replace(/\B[^0-9]{1,}\B/g, "");// non-word-boundary para selecionar posições dentro de uma palavra. (caso o usuário mova o cursor e tente inserir alguma letra entre os números)            
                v = v.replace(/\b[^0-9]{1,}\b/g, "");//word boundary para selecionar a posição antes ou depois de uma palavra. (caso o usuário mova o cursor e tente inserir algum caractere entre os números)            
            }
            return v;
        }

Teste as regex com o programa de testes fornecido no curso.

Abraço