So machen Sie type = "number" nur zu positiven Zahlen

284

Derzeit habe ich den folgenden Code

<input type="number" />

es kommt zu so etwas heraus

Geben Sie hier die Bildbeschreibung ein

Die kleinen Auswahlelemente auf der rechten Seite lassen die Zahl negativ werden. Wie verhindere ich das?

Ich habe Zweifel an der Verwendung type="number", es verursacht mehr Probleme als es löst, ich werde es trotzdem auf geistige Gesundheit überprüfen, also sollte ich einfach wieder verwenden type="text"?

Arian Faurtosh
quelle
4
Sie müssen den Wert auf dem Server noch überprüfen. Jeder kann das Feld überschreiben, um den gewünschten Inhalt zu senden.
zzzzBov
2
@zzzzBov Ja, ich validiere es mit PHP und verwende auch Prepare-Anweisungen. Das einzige, worüber ich mir Sorgen machen muss, sind Benutzer, die wissen, wie man einen Webbrowser verwendet. lol
Arian Faurtosh

Antworten:

634

Fügen Sie ein minAttribut hinzu

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

QUentin
quelle
35
Dies funktioniert für die Auswahlpfeile, ermöglicht jedoch die Eingabe einer negativen Zahl
David Burton
2
Das Ändern des Attributs in min="0.000001"hilft in den meisten Fällen. JavaScript konvertiert es mit mehr als 6 Dezimalstellen in das Exponentenformat.
MarkMYoung
Standardmäßig sind nur Ganzzahlen zulässig, keine Dezimalstellen. Siehe Zulassen von Dezimalwerten .
Str
118

Ich habe eine andere Lösung gefunden, um eine negative Zahl zu verhindern.

<input type="number" name="test_name" min="0" oninput="validity.valid||(value='');">
Kushal
quelle
Sie können damit keine schwebenden Zahlen hinzufügen. Auch der numerische Stepper funktioniert hier nicht.
Hamzox
1
oninput="validity.valid||(value='');"verhindert, dass man fünf Zahlen eingibt
Hallo Universum
5
Dies sollte als gültige Antwort markiert werden, da es auch die Eingabe von "-" Zeichen
JanBrus
Dies funktioniert hervorragend, wenn Sie wie ich nur positive, ganze Zahlen benötigen. Vielen Dank!
Boris
74

Es hängt davon ab, wie genau Sie sein möchten. Wenn Sie nur ganze Zahlen akzeptieren möchten, als:

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

Wenn Sie Floats mit beispielsweise zwei Nachkommastellen wünschen:

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

Pavlo
quelle
Es scheint derzeit funktioniert es ohne einen Schritt = "1" ... sollte ich es noch hinzufügen?
Arian Faurtosh
@Arian Sie können es weglassen, solange Sie keinen maxWert angeben .
Pavlo
1
Schritt 1 ist die Standardeinstellung des Browsers, alles in Ordnung
Stephan Muller
4
Dies verhindert nicht, dass immer noch schlechte Werte eingegeben werden. Wenn Sie den Schrittwert Chrom weglassen, wird die Validierung beim Eingeben reduziert, sodass Sie nicht numerische Werte eingeben können. Mit Step Set können Sie nur Werte außerhalb des Min-Max-Bereichs eingeben - immer noch falsch, aber besser.
David Burton
min = "1" step = "1" erlaubt mir immer noch, schwebende Zahlen wie 1.2 einzugeben. Wie kann ich nur Ganzzahlen erzwingen?
Sam
50

Sie können erzwingen, dass die Eingabe nur eine positive Ganzzahl enthält, indem Sie sie onkeypressinnerhalb des inputTags hinzufügen .

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

Hier wird event.charCode >= 48sichergestellt, dass nur Zahlen größer oder gleich 0 zurückgegeben werden, während das minTag sicherstellt, dass Sie durch Scrollen in der Eingabeleiste ein Minimum von 1 erreichen können.

Shubham Mittal
quelle
3
Am Rand können Sie hier "A" eingeben.
Amy Blankenship
10
Sie können immer noch eine negative Zahl einfügen
Methyl
5

Sie können Folgendes verwenden, um type="number"nur positive Zahlen zu akzeptieren:

input type="number" step="1" pattern="\d+"
Deepali
quelle
2
Können Sie versuchen zu erklären, was Ihre Aussage bewirkt und warum sie hilft? Außerdem haben Sie zwei verschiedene Schnipsel. Welches ist korrekt?
Aenadon
2
Durch Hinzufügen eines Schrittattributs beschränken Sie die Eingabe auf eine Ganzzahl, und durch Hinzufügen des Musters wird sichergestellt, dass bei Verwendung eines Bruchteils das Feld als ungültig markiert wird, dies jedoch von den Browserimplementierungen abhängt (Firefox markiert das Feld als rot, wenn die Eingabe den Fokus verliert, während Chrome dies nicht zulässt Sie geben zunächst unzulässige Werte ein. Man sollte dies auf dem Server / Client validieren.
Deepali
5

Sie können eine negative Eingabe in einem Zahleneingabeformular folgendermaßen verhindern:

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

Hafijur Rahman Sakib
quelle
3

Versuchen

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

Rogerio de Moraes
quelle
Wenn Sie einen Typ definieren, benötigen Sie ein bestimmtes Format für die Rolle.
Rogerio de Moraes
7
Versuchte dies in Chrom, und es erzwingt nicht das Muster
David Burton
Gibt es eine Möglichkeit, wenn ich type = "text" anstelle von "number" hinzufüge?
Kapil Verma
1

Wenn Sie einen Text eingeben müssen, funktioniert das Muster auch

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

Ich kann nicht die perfekte Lösung finden, da einige Arbeiten zum Eingeben, aber nicht zum Kopieren und Einfügen verwendet werden. Einige sind umgekehrt. Diese Lösung funktioniert bei mir. Es verhindert negative Zahlen, indem Sie "e" eingeben, "e" kopieren und einfügen.

eine Funktion erstellen.

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

Fügen Sie diese Eigenschaften zur Eingabe hinzu. Diese beiden verhindern das Kopieren und Einfügen von nicht nummeriertem Text, einschließlich "e". Sie müssen beide zusammen haben, um wirksam zu werden.

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

Wenn Sie Vue verwenden , können Sie diese Antwort hier verweisen . Ich habe es zu einem Mixin extrahiert, das wiederverwendet werden kann.

Arst
quelle
0

Fügen Sie diesen Code in Ihren Eingabetyp ein.

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

beispielsweise:

<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
quelle
1
Das ist wirklich verwirrend für alle, die nicht verstehen, was passiert.
RozzA
Auf diese Weise können Sie immer noch alles in die Eingabe, das Alphabet oder sogar Sonderzeichen
einfügen
0

Eine andere Lösung besteht darin, Js zu verwenden, um es positiv zu machen (die Option min kann deaktiviert werden und ist nicht gültig, wenn der Benutzer smth eingibt). Das negative Ereignis if ist nicht erforderlich und on ('keydown') kann ebenfalls verwendet werden!

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

Dies hängt davon ab, ob Sie ein int- oder ein float-Feld möchten. So würden die beiden aussehen:

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

Dem int-Feld ist die korrekte Validierung zugeordnet, da seine min 1 ist. Das float-Feld akzeptiert jedoch 0; Um dies zu beheben, können Sie einen weiteren Einschränkungsvalidator hinzufügen :

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

Beachten Sie, dass keine dieser Lösungen den Benutzer vollständig daran hindert, ungültige Eingaben einzugeben. Sie können jedoch anrufen checkValidityoderreportValidity herausfinden, ob der Benutzer gültige Eingaben eingegeben hat.

Natürlich sollten Sie immer noch eine serverseitige Validierung haben, da der Benutzer die clientseitige Validierung immer ignorieren kann.

Kevinji
quelle
0

Versuche dies:

  • Getestet in Winkel 8
  • Werte sind positiv
  • Dieser Code behandelt auch Werte nullund negitiveWerte.
              <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
quelle
0

Wenn Sie versuchen, eine negative Zahl einzugeben, blockiert das Ereignis onkeyup dies. Wenn Sie den Pfeil auf der Eingabenummer verwenden, löst das Ereignis onblur diesen Teil auf.

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

Wictor Chaves
quelle
-2

Mit der Texteingabe können Sie diese für eine bessere Validierung verwenden.

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

Versuche dies:

Yii2 : Validation rule 

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