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.