Cómo hacer que type = “number” solo a números positivos

284

actualmente tengo el siguiente código

<input type="number" />

se trata de algo como esto

ingrese la descripción de la imagen aquí

Las pequeñas cosas del selector a la derecha permiten que el número entre en negativo. ¿Cómo evito eso?

Tengo dudas sobre el uso type="number", está causando más problemas de los que está resolviendo, de todos modos voy a revisar la sanidad, ¿debería volver a usarlo type="text"?

Arian Faurtosh
fuente
44
Aún deberá validar el valor en el servidor. Cualquiera podría anular el campo para enviar el contenido que desee.
zzzzBov
2
@zzzzBov Sí, lo valido con php, y también uso declaraciones preparadas, lo único que me preocupa es los usuarios que saben usar un navegador web. lol
Arian Faurtosh

Respuestas:

634

Agregar un minatributo

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

Quentin
fuente
36
Esto funciona para las flechas del selector, pero permite escribir un número negativo
David Burton
2
Cambiar el atributo a min="0.000001"ayudará en la mayoría de los casos. Más de 6 decimales, JavaScript lo convertirá a formato de exponente.
MarkMYoung
Por defecto, esto solo permite enteros pero no decimales. Ver Permitir valores decimales .
str
118

He encontrado otra solución para evitar el número negativo.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">
Kushal
fuente
No puede agregar números flotantes con esto. Además, los pasos numéricos no funcionan aquí también.
hamzox
1
oninput="validity.valid||(value='');"se detiene uno de los números de escritura-ve
Hola Universo
55
Esto debe marcarse como respuesta válida ya que también evita escribir el carácter "-"
JanBrus
Esto funciona muy bien si solo necesita números enteros positivos, como yo lo hice. ¡Gracias!
Boris el
74

Depende de cuán preciso quieras ser. Si desea aceptar solo enteros, que:

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

Si desea flotadores con, por ejemplo, dos dígitos después del punto decimal:

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

Pavlo
fuente
Parece que actualmente funciona sin un paso = "1" ... ¿debería agregarlo?
Arian Faurtosh
@Arian, puede omitirlo siempre que no especifique el maxvalor.
Pavlo
1
El paso 1 es el valor predeterminado del navegador, estás bien
Stephan Muller
44
Esto no impide aún escribir valores incorrectos: si omite el valor de paso, Chrome reduce la validación que hace al escribir para que pueda ingresar valores no numéricos. Con el paso establecido, solo le permite escribir valores fuera del rango min-max, aún incorrecto, pero mejor.
David Burton
min = "1" step = "1" todavía me permite escribir números flotantes como 1.2 ¿Cómo puedo forzar solo enteros?
Sam
50

Puede forzar la entrada para que contenga solo enteros positivos agregando onkeypressdentro de la inputetiqueta.

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

Aquí, se event.charCode >= 48garantiza que solo se devuelvan números mayores o iguales a 0, mientras que la minetiqueta garantiza que puede llegar a un mínimo de 1 desplazándose dentro de la barra de entrada.

Shubham Mittal
fuente
3
En Edge puedes ingresar "A" en esto.
Amy Blankenship
10
Todavía puede pegar un número negativo
metil
5

Puede usar lo siguiente para type="number"aceptar solo números positivos:

input type="number" step="1" pattern="\d+"
Deepali
fuente
2
¿Puedes tratar de explicar qué hace tu declaración y por qué ayuda? Además, tiene dos fragmentos diferentes. ¿Cuál es el correcto?
Aenadon
2
Al agregar el atributo de paso, restringe la entrada al número entero y al agregar el patrón se garantiza que cualquier uso de una porción fraccional haga que el campo se marque como no válido, pero depende de las implementaciones del navegador (Firefox marca el campo como rojo cuando la entrada pierde el foco, mientras que Chrome no permite ingresa valores no permitidos en primer lugar). Uno debería validar esto en el servidor / cliente.
Deepali
5

Puede evitar la entrada negativa en forma de entrada numérica de la siguiente manera:

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

Hafijur Rahman Sakib
fuente
3

Tratar

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

Rogerio de Moraes
fuente
Cuando define un tipo, necesita un formato específico para el rol.
Rogerio de Moraes
77
Intenté esto en cromo, y no impone el patrón
David Burton,
¿Hay alguna forma de que si agrego type = "text" en lugar de "number"?
Kapil Verma
1

Si necesita ingresar texto , el patrón también funciona

<input type="text" pattern="\d+">
ABDO
fuente
1

No puedo encontrar la solución perfecta ya que algunos funcionan para ingresar pero no para copiar y pegar, algunos son al revés. Esta solución me funciona. Impide el número negativo, escribiendo "e", copia y pega el texto "e".

crear una función

<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>

agregue estas propiedades a la entrada. estos dos impiden copiar y pegar textos que no sean números, incluida "e". necesitas tener ambos juntos para que surtan efecto.

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

Si está utilizando Vue , puede consultar esta respuesta aquí . Lo he extraído en un mixin que se puede reutilizar.

Primero
fuente
0

agregue este código en su tipo de entrada;

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

por ejemplo:

<input type="text" name="age" onkeypress="return (event.charCode == 8 || event.charCode == 0 || event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 57" />
Sakawa Bob
fuente
1
Esto es realmente confuso para cualquiera que no entienda lo que está sucediendo.
RozzA
De esta manera, todavía puede pegar cualquier cosa en la entrada, el alfabeto o incluso caracteres especiales
Lê Gia Lễ
0

Otra solución es usar Js para hacerlo positivo (la opción min se puede deshabilitar y no es válida cuando el usuario escribe smth) ¡También se puede usar el evento negativo si no es necesario y encendido ('keydown')!

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

Depende de si desea un campo int o flotante. Así es como se verían los dos:

<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">

El campo int tiene la validación correcta adjunta, ya que su mínimo es 1. Sin embargo, el campo flotante acepta 0; Para lidiar con esto, puede agregar un validador de restricción más :

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);

JS Violín aquí.

Tenga en cuenta que ninguna de estas soluciones impide por completo que el usuario intente escribir una entrada no válida, pero puede llamar checkValidityoreportValidity averiguar si el usuario ha ingresado una entrada válida.

Por supuesto, aún debe tener la validación del lado del servidor porque el usuario siempre puede ignorar la validación del lado del cliente.

kevinji
fuente
0

Prueba esto:

  • Probado en Angular 8
  • los valores son positivos
  • Este código también maneja nully negitivevalora.
              <input
                type="number"
                min="0"
                (input)="funcCall()" -- Optional
                oninput="value == '' ? value = 0 : value < 0 ? value = value * -1 : false"
                formControlName="RateQty"
                [(value)]="some.variable" -- Optional
              />
geeth-marathi
fuente
0

Si intenta ingresar un número negativo, el evento onkeyup lo bloquea y si usa la flecha en el número de entrada, el evento onblur resuelve esa parte.

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

Wictor Chaves
fuente
-2

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

FRabbi
fuente
-2

Con el tipo de entrada de texto puede usar esto para una mejor validación,

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

Prueba esto:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
usuario10132380
fuente