Como fazer type = "number" apenas para números positivos


284

atualmente eu tenho o seguinte código

<input type="number" />

sai para algo assim

insira a descrição da imagem aqui

As pequenas coisas do seletor à direita permitem que o número fique negativo. Como evito isso?

Estou com dúvidas sobre o uso type="number", está causando mais problemas do que está resolvendo, vou verificar a sanidade de qualquer maneira, então devo voltar a usar type="text"?


4
Você ainda precisará validar o valor no servidor. Qualquer pessoa pode substituir o campo para enviar o conteúdo que quiser.
— ZzzzBov 07/07/2013

2
@zzzzBov Sim, eu valido com php, e também uso instruções de preparação, a única coisa que resta a se preocupar são os usuários que sabem como usar um navegador da web. rsrs
— Arian Faurtosh

Respostas:


634

Adicionar um minatributo

<input type="number" min="0">


36
Isso funciona para as setas do seletor, mas permite digitar um número negativo
— David Burton

2
Alterar o atributo para min="0.000001"ajudará na maioria dos casos. Mais de 6 casas decimais, o JavaScript o converterá no formato de expoente.
— MarkMYoung

Por padrão, isso permite apenas números inteiros, mas não decimais. Consulte Permitindo valores decimais .
— str

118

Eu encontrei outra solução para evitar número negativo.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">

Você não pode adicionar números flutuantes com isso. Além disso, o stepper numérico não funciona aqui também.
— Hamzox

1
oninput="validity.valid||(value='');"pára um dos números de digitação-ve
— Olá Universo

5
Este deve ser marcado como resposta válida, uma vez que também evita a digitação caractere "-"
— JanBrus

Isso funciona muito bem se você precisar apenas de números inteiros positivos, como eu fiz. Obrigado!
— Boris

74

Depende da precisão que você deseja ser. Você deseja aceitar apenas números inteiros que:

<input type="number" min="1" step="1">

Se você deseja carros alegóricos com, por exemplo, dois dígitos após o ponto decimal:

<input type="number" min="0.01" step="0.01">


Parece que atualmente funciona sem uma etapa = "1" ... ainda devo adicioná-lo?
— Arian Faurtosh

@Arian, você pode omiti-lo, desde que não especifique maxvalor.
— Pavlo 7/10

1
Passo 1 é o padrão do navegador, você está bem
— Stephan Muller

4
Isso ainda não impede a digitação de valores inválidos - se você omitir o valor da etapa, o chrome reduz a validação ao digitar, para que você possa inserir valores não numéricos. Com o passo definido, você só pode digitar valores fora do intervalo min-max - ainda errado, mas melhor.
— David Burton

min = "1" step = "1" ainda permite digitar números flutuantes como 1,2 Como posso forçar apenas números inteiros?
— Sam

50

Você pode forçar a entrada a conter apenas um número inteiro positivo adicionando onkeypressna inputtag.

<input type="number" onkeypress="return event.charCode >= 48" min="1" >

Aqui, event.charCode >= 48garante que apenas números maiores ou iguais a 0 sejam retornados, enquanto a mintag garante que você possa chegar a um mínimo de 1 rolando na barra de entrada.


3
No Edge, você pode inserir "A" neste.
— Amy Blankenship

10
Você ainda pode colar número negativo
— metil

5

Você pode usar o seguinte para type="number"aceitar somente números positivos:

input type="number" step="1" pattern="\d+"

2
Você pode tentar explicar o que a sua declaração faz e por que ela ajuda? Além disso, você tem dois trechos diferentes. Qual deles está correto?
— Aenadon

2
adicionando o atributo step, você restringe a entrada ao número inteiro e adiciona o padrão para garantir que qualquer uso de uma parte fracionária obtenha o campo marcado como inválido, mas depende das implementações do navegador (o Firefox marca o campo como vermelho na entrada, perdendo o foco, enquanto o Chrome não permite você insere valores não permitidos). Deve-se validar isso no servidor / cliente.
— Deepali

5

Você pode impedir a entrada negativa em um formulário de entrada de número da seguinte forma:

<input type="number" onkeyup="if(this.value<0){this.value= this.value * -1}">


3

Experimentar

<input type="number" pattern="^[0-9]" title='Only Number' min="1" step="1">


Ao definir um tipo, você precisa de um formato específico para a função.
— Rogerio de Moraes

7
Tentou acessar este em cromo, e não impor o padrão
— David Burton

Existe uma maneira de se eu adicionar type = "text" em vez de "number"?
— precisa

1

Se precisar de entrada de texto , o padrão também funciona

<input type="text" pattern="\d+">

1

Não consigo encontrar a solução perfeita, pois alguns funcionam para inserir, mas não para copiar e colar, alguns são o contrário. Esta solução funciona para mim. Evita que o número negativo seja digitado "e", copie e cole o texto "e".

crie uma função.

<script language="JavaScript">

  // this prevents from typing non-number text, including "e".
  function isNumber(evt) {
    evt = (evt) ? evt : window.event;
    let charCode = (evt.which) ? evt.which : evt.keyCode;
    if ((charCode > 31 && (charCode < 48 || charCode > 57)) && charCode !== 46) {
      evt.preventDefault();
    } else {
      return true;
    }
  }
</script>

adicione essas propriedades à entrada. esses dois impedem de copiar e colar texto não numérico, incluindo "e". você precisa ter os dois juntos para entrar em vigor.

<input type="number" oninput="validity.valid||(value='');" onpress="isNumber(event)" />

Se você estiver usando o Vue, pode consultar esta resposta aqui . Eu o extraí para um mixin que pode ser reutilizado.


0

adicione este código no seu tipo de entrada;

onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57"

por exemplo:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />

1
isso é realmente confuso para quem não entende o que está acontecendo.
— RozzA

Dessa forma, você ainda pode colar qualquer coisa na entrada, no alfabeto ou mesmo em caracteres especiais
— Lê Gia Lễ

0

Outra solução é usar Js para torná-lo positivo (a opção min pode ser desativada e não é válida quando o usuário digita smth) O evento negativo se não for necessário e ativado ('keydown') também pode ser usado!

let $numberInput =  $('#whatEverId');
$numberInput.on('change', function(){
    let numberInputText = $numberInput.val();
    if(numberInputText.includes('-')){
        $numberInput.val(Math.abs($numberInput.val()));
    }
});

0

Depende se você deseja um campo int ou float. Aqui está a aparência dos dois:

<input type="number" name="int-field" id="int-field" placeholder="positive int" min="1" step="1">
<input type="number" name="float-field" id="float-field" placeholder="positive float" min="0">

O campo int possui a validação correta anexada, pois seu mínimo é 1. O campo flutuante aceita 0, no entanto; Para lidar com isso, você pode adicionar mais um validador de restrição :

function checkIsPositive(e) {
  const value = parseFloat(e.target.value);
  if (e.target.value === "" || value > 0) {
    e.target.setCustomValidity("");
  } else {
    e.target.setCustomValidity("Please select a value that is greater than 0.");
  }
}

document.getElementById("float-field").addEventListener("input", checkIsPositive, false);

JSFiddle aqui.

Observe que nenhuma dessas soluções impede completamente o usuário de digitar uma entrada inválida, mas você pode ligar checkValidityoureportValidity descobrir se o usuário digitou uma entrada válida.

Obviamente, você ainda deve ter a validação do lado do servidor porque o usuário sempre pode ignorar a validação do lado do cliente.


0

Tente o seguinte:

  • Testado em Angular 8
  • valores são positivos
  • Este código também fornece null e negitivevalores.
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />

0

Se você tentar inserir um número negativo, o evento onkeyup bloqueará isso e, se você usar a seta no número de entrada, o evento onblur resolverá essa parte.

<input type="number" 
    onkeyup="if(this.value<0)this.value=1"
    onblur="if(this.value<0)this.value=1"
>



-2

Com o tipo de texto de entrada, você pode usá-lo para uma melhor validação,

return (event.keyCode? (event.keyCode == 69 ? false : event.keyCode >= 48 && event.keyCode <= 57) : (event.charCode >= 48 && event.charCode <= 57))? true : event.preventDefault();

-4

Tente o seguinte:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.