Come rendere type = "number" solo per numeri positivi


285

attualmente ho il seguente codice

<input type="number" />

viene fuori a qualcosa del genere

inserisci qui la descrizione dell'immagine

Le piccole cose di selezione sulla destra consentono al numero di andare in negativo. Come posso impedirlo?

Ho dei dubbi sull'utilizzo type="number", sta causando più problemi di quanti ne risolva, vado comunque a controllare la sanità mentale, quindi dovrei semplicemente tornare a usare type="text"?


4
Sarà comunque necessario convalidare il valore sul server. Chiunque potrebbe scavalcare il campo per inviare qualunque contenuto desideri.
zzzzBov,

2
@zzzzBov Sì, lo convalido con php e utilizzo anche le istruzioni di preparazione, l'unica cosa di cui preoccuparsi è che gli utenti che sanno l'orzo sanno come utilizzare un browser web. lol
Arian Faurtosh,

Risposte:


636

Aggiungi un minattributo

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


37
Funziona con le frecce di selezione, ma consente di digitare un numero negativo
David Burton

2
La modifica dell'attributo in min="0.000001"aiuterà nella maggior parte dei casi. Più di 6 cifre decimali, JavaScript lo convertirà in formato esponente.
MarkMYoung,

Per impostazione predefinita, ciò consente solo numeri interi ma non decimali. Vedere Consentire valori decimali .
str

118

Ho trovato un'altra soluzione per prevenire il numero negativo.

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

Non è possibile aggiungere numeri mobili con questo. Inoltre, anche lo stepper numerico non funziona qui.
Hamzox,

1
oninput="validity.valid||(value='');"impedisce a uno di digitare-ve numeri
Hello Universe

5
Questo dovrebbe essere contrassegnato come risposta valida poiché impedisce anche di digitare il carattere "-"
JanBrus

Funziona alla grande se hai bisogno solo di numeri interi interi positivi, come ho fatto io. Grazie!
Boris,

74

Dipende da quanto preciso vuoi essere. Si desidera accettare solo numeri interi, quindi:

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

Se vuoi float con, ad esempio, due cifre dopo il punto decimale:

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


Sembra che al momento funzioni senza un passo = "1" ... dovrei ancora aggiungerlo?
Arian Faurtosh,

@Arian puoi ometterlo purché non specifichi il maxvalore.
Pavlo,

1
Il passaggio 1 è l'impostazione predefinita del browser, stai bene
Stephan Muller,

4
Ciò non impedisce di digitare ancora valori errati: se si omette il valore del passaggio chrome riduce la convalida che esegue durante la digitazione, in modo da poter immettere valori non numerici. Con step set ti permette di digitare solo valori al di fuori dell'intervallo min-max - ancora sbagliato, ma migliore.
David Burton,

min = "1" step = "1" mi permette ancora di digitare numeri fluttuanti come 1.2 Come posso forzare solo numeri interi?
Sam,

51

Puoi forzare l'input a contenere solo numeri interi positivi aggiungendo onkeypressall'interno del inputtag.

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

Qui, event.charCode >= 48garantisce che vengano restituiti solo numeri maggiori o uguali a 0, mentre il mintag assicura che è possibile arrivare a un minimo di 1 scorrendo all'interno della barra di input.


3
Su Edge puoi inserire "A" in questo.
Amy Blankenship,

10
Puoi ancora incollare il numero negativo
metile

5

È possibile utilizzare quanto segue per type="number"accettare solo numeri positivi:

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

2
Puoi provare a spiegare cosa fa la tua affermazione e perché aiuta? Inoltre, hai due frammenti diversi. Quale è corretto?
Aenadon,

2
aggiungendo l'attributo step, si limita l'input all'intero e l'aggiunta del pattern garantisce che qualsiasi utilizzo di una porzione frazionaria ottenga il campo contrassegnato come non valido ma dipende dalle implementazioni del browser (Firefox contrassegna il campo come rosso sull'input perdendo il focus mentre Chrome non consente inserisci i valori non consentiti in primo luogo). Uno dovrebbe convalidare questo sul server / client.
Deepali,

5

È possibile impedire l'input negativo in un modulo di input numerico nel modo seguente:

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


3

Provare

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


Quando si definisce un tipo, è necessario un formato specifico per il ruolo.
Rogerio de Moraes,

7
Ho provato questo in cromo, e non impone il modello
David Burton

C'è un modo che se aggiungo type = "text" invece di "number"?
Kapil Verma,

1

Se è necessario inserire il testo , anche il modello funziona

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

1

Non riesco a trovare la soluzione perfetta poiché alcuni lavorano per l'inserimento ma non per il copia e incolla, altri sono il contrario. Questa soluzione funziona per me. Impedisce il numero negativo, digitando "e", copia e incolla il testo "e".

creare una funzione.

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

aggiungi queste proprietà all'input. questi due impediscono di copiare e incollare testo non numerico, incluso "e". devi avere entrambi insieme per avere effetto.

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

Se stai usando Vue puoi fare riferimento a questa risposta qui . L'ho estratto in un mixin che può essere riutilizzato.


0

aggiungi questo codice nel tuo tipo di input;

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

per esempio:

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

1
questo è davvero confuso per chiunque non capisca cosa sta succedendo.
RozzA

In questo modo, puoi ancora incollare qualsiasi cosa sull'input, sull'alfabeto o persino sui caratteri speciali
Lê Gia Lễ

0

Un'altra soluzione è usare Js per renderlo positivo (l'opzione min può essere disabilitata e non è valida quando l'utente digita smth) L'evento negativo se non è necessario e attivo ('keydown') può anche essere usato!

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

0

Dipende se si desidera un campo int o float. Ecco come sarebbero i due:

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

Al campo int è associata la corretta convalida, poiché il suo minimo è 1. Il campo float accetta 0, tuttavia; per risolvere questo problema, puoi aggiungere un altro validatore di vincoli :

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

Si noti che nessuna di queste soluzioni impedisce completamente all'utente di provare a digitare un input non valido, ma è possibile chiamare checkValidityoreportValidity capire se l'utente ha digitato un input valido.

Ovviamente, dovresti comunque avere la convalida sul lato server perché l'utente può sempre ignorare la convalida sul lato client.


0

Prova questo:

  • Testato in Angolare 8
  • i valori sono positivi
  • Questo codice gestisce anche valori nulle negitivevalori.
              <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 si tenta di inserire un numero negativo, l'evento onkeyup lo blocca e se si utilizza la freccia sul numero di input, l'evento onblur risolve quella parte.

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



-2

Con il tipo di input di testo puoi utilizzarlo per una migliore convalida,

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

-4

Prova questo:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.