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


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


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='');">

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


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.


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

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


3

Versuchen

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


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

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.


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

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

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.


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

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



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

-4

Versuche dies:

Yii2 : Validation rule 

    public function rules() {
    return [
['location_id', 'compare', 'compareValue' => 0', 'operator' => '>'],
        ];
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.