Gibt es eine Möglichkeit zu verhindern, dass der Eingabetyp = "Zahl" negative Werte erhält?


Antworten:


658

Verwenden Sie das minAttribut wie folgt:

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


222
Dadurch wird verhindert, dass eine negative Zahl mit den Pfeiltasten / dem Drehknopf eingegeben wird. Der Benutzer kann jedoch weiterhin manuell eine negative Zahl eingeben und den Wert dieses Felds als negative Zahl lesen lassen, wodurch das Attribut min umgangen wird.
Ecbrodie

52
@demaniak Nein. Und wie kam es, dass diese Antwort so viele positive Stimmen erhielt, wenn sie die Frage zur Hälfte beantwortete, ist ein Rätsel
GôTô

1
@Abraham Was passiert, wenn die Daten, die mit dem Wert -ve im Formular geladen wurden, nicht als rot markiert werden?
Kamini

2
Dies funktioniert nicht, der Benutzer kann dennoch manuell eine negative Zahl eingeben.
Altef vier

129

Ich war mit der Antwort von @Abhrabm nicht zufrieden , weil:

Es wurde nur verhindert, dass negative Zahlen über Aufwärts- / Abwärtspfeile eingegeben werden, während Benutzer negative Zahlen über die Tastatur eingeben können.

Die Lösung besteht darin, mit Schlüsselcode zu verhindern :

// Select your input element.
var number = document.getElementById('number');

// Listen for input event on numInput.
number.onkeydown = function(e) {
    if(!((e.keyCode > 95 && e.keyCode < 106)
      || (e.keyCode > 47 && e.keyCode < 58) 
      || e.keyCode == 8)) {
        return false;
    }
}
<form action="" method="post">
  <input type="number" id="number" min="0" />
  <input type="submit" value="Click me!"/>
</form>

Klarstellung von @Hugh Guiney :

Welche Schlüsselcodes werden überprüft:

  • 95, <106 entspricht Numpad 0 bis 9;
  • 47, <58 entspricht 0 bis 9 in der Zahlenreihe; und 8 ist Rücktaste.

Dieses Skript verhindert also, dass ungültige Schlüssel in die Eingabe eingegeben werden.


20
Upvoted, aber ich denke, es würde helfen zu klären, welche Schlüsselcodes überprüft werden:> 95, <106 entspricht Numpad 0 bis 9; > 47, <58 entspricht 0 bis 9 in der Zahlenreihe; und 8 ist Rücktaste. Dieses Skript verhindert also, dass Schlüssel außer denen eingegeben werden. Es ist gründlich, aber ich denke, es könnte für Browser, die von Haus aus Zahleneingaben unterstützen, die bereits alphabetische Tasten herausfiltern, übertrieben sein (mit Ausnahme von Zeichen wie "e", die eine numerische Bedeutung haben können). Es würde wahrscheinlich ausreichen, gegen 189 (Bindestrich) und 109 (Subtrahieren) zu verhindern. Und dann kombinieren mit min="0".
Hugh Guiney

1
@Manwal Das Kopieren und Einfügen von Zahlen über die Tastatur ist eingeschränkt. Und erlaubt mir, negative Zahlen mit der Maus einzufügen.
Beniton

1
@ Beniton Vielen Dank für diesen Anwendungsfall. Können Sie mir eine kleine Vorstellung davon geben, was Sie tun? Ich kann Ihnen immer helfen. Bitte geben Sie wenig ausführbaren Code oder Geige an. Sie können in Ihrem Code das Formular Submit Level Validation für haben. Obwohl ich immer im Backend einchecken muss, wenn ich keine negativen Zahlen zulasse.
Manwal

1
Einfach kopieren und in das Feld einfügen. Es ist nicht wirklich ein Sonderfall oder so. Anstatt die Validierung über den Schlüsselcode durchzuführen, ist es wahrscheinlich besser, sie auf Change oder focusOut durchzuführen und eine kleine Validierungsfunktion zu erstellen, um negative Zahlen abzufangen.
ulisesrmzroche

1
Die Bedingung für die Pfeiltaste (37, 38, 39, 41) sollte ebenfalls festgelegt werden. || (e.keyCode>36 && e.keyCode<41)Dadurch kann der Benutzer die Nummer nicht durch den Aufwärts- / Abwärtspfeil erhöhen / verringern und nach rechts / links gehen, um die Nummer zu bearbeiten.
Vusan

86

Für mich war die Lösung:

<input type="number" min="0" oninput="this.value = Math.abs(this.value)">

1
Wirklich beste Lösung, wenn Sie Muster verwenden und mit Winkel nicht validieren, da das Modell nicht aktualisiert wird, wenn es nicht innerhalb des Bereichs liegt. Mein Fall:<input ng-model="row.myValue" type="{{row.code == 1 ? 'text' : 'number'}}" min="0" ng-pattern="..." noformvalidate oninput="if (this.type=='text') this.value=Math.abs(this.value) ">
Sebius

Dies funktioniert am besten, wenn der Benutzer weiß, dass der Standardwert 0 ist. Andere Benutzer sind verwirrt, wenn Sie die Rücktaste drücken und drücken, warum das Feld nicht gelöscht wird. Abgesehen davon ist es die beste Lösung. + 1
Deep 3015

1
Du hast meinen Tag gerettet
Stackmalux

Dieser funktioniert am besten und bei Verwendung von Dezimalstellen auch. Ich hatte oben eine andere Antwort verwendet, sie funktionierte nicht mehr, wenn Dezimalstellen zulässig sein sollen. Gibt es eine Möglichkeit, diese Antwort nach oben zu verschieben, damit die Leute sie meistens verwenden können?
Subhan Ahmed

31

Dieser Code funktioniert gut für mich. Können Sie es bitte überprüfen:

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

2
Dies funktioniert, aber das Leeren der gesamten Eingabe nach dem Versuch zu tippen -ist keine gute Idee.
Extempl

9
@extempl Klingt nach einer fairen Bestrafung für den Benutzer, der versucht, ein Negativ in ein Feld einzugeben, in dem der gesunde Menschenverstand angibt, dass es keine Negative gibt.
KhoPhi

3
<input type="number" name="test" min="0" oninput="validity.valid||(value=value.replace(/\D+/g, ''))">- Dies wird alle nicht-stelligen Symbole entfernen
Oleh Melnyk

@Rexford Ich stimme zu, aber ich habe min="0"so eingestellt , dass es keine Nagative gibt. Wenn Sie einen negativen Wert möchten, entfernen Sie dieses Attribut.
Chinmay235

1
Ich habe es versucht, aber es hat auch verhindert, dass Zahlen mit Dezimalstellen eingegeben werden.
Klent

21

Einfache Methode:

<input min='0' type="number" onkeypress="return (event.charCode == 8 || event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57">


Schön und einfach ... aber dennoch können negative Zahlen eingefügt werden.
Ralf

10

Ich wollte Dezimalzahlen zulassen und nicht die gesamte Eingabe löschen, wenn ein Negativ eingegeben wurde. Dies funktioniert zumindest in Chrom gut:

<input type="number" min="0" onkeypress="return event.charCode != 45">

Wie kann man hier mehr ASCII-Nummern hinzufügen? für zB. mit 45 möchte ich auch 46 hinzufügen. Wie geht das?
Pradeep Singh

3
@PradeepSingh "return [45, 46] .indexOf (event.charCode) == -1"
ykay sagt Reinstate Monica

Bitte denken Sie über den Tellerrand hinaus. Sind Sie wirklich sicher, dass a keypressdie einzige Möglichkeit ist, eine negative Zahl in eine Eingabe einzugeben ...
Roko C. Buljan

6

Die @ Mandal-Antwort ist gut, aber ich mag Code mit weniger Codezeilen für eine bessere Lesbarkeit. Außerdem verwende ich stattdessen gerne die Verwendung von onclick / onkeypress in HTML.

Meine vorgeschlagene Lösung macht dasselbe: Hinzufügen

min="0" onkeypress="return isNumberKey(event)"

zur HTML-Eingabe und

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : event.keyCode;
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

als Javascript-Funktion.

Wie gesagt, es macht das gleiche. Es ist nur eine persönliche Präferenz, wie das Problem gelöst werden soll.


5

Nur als Referenz: Mit jQuery können Sie negative Werte auf focusout mit dem folgenden Code überschreiben:

$(document).ready(function(){
    $("body").delegate('#myInputNumber', 'focusout', function(){
        if($(this).val() < 0){
            $(this).val('0');
        }
    });
});

Dies ersetzt nicht die serverseitige Validierung!


Dies funktioniert gut , WENN der Benutzer des Eingabefeldes konzentriert sich jedoch herausgestellt, wenn sie sofort drücken , während noch in dem Feld eingeben; Sie können immer noch eine negative Zahl eingeben.
NemyaNation

3

Hier ist eine Winkel-2-Lösung:

Erstellen Sie eine Klasse OnlyNumber

import {Directive, ElementRef, HostListener} from '@angular/core';

@Directive({
  selector: '[OnlyNumber]'
})
export class OnlyNumber {

  // Allow decimal numbers. The \. is only allowed once to occur
  private regex: RegExp = new RegExp(/^[0-9]+(\.[0-9]*){0,1}$/g);

  // Allow key codes for special events. Reflect :
  // Backspace, tab, end, home
  private specialKeys: Array<string> = ['Backspace', 'Tab', 'End', 'Home'];

  constructor(private el: ElementRef) {
  }

  @HostListener('keydown', ['$event'])
  onKeyDown(event: KeyboardEvent) {
    // Allow Backspace, tab, end, and home keys
    if (this.specialKeys.indexOf(event.key) !== -1) {
      return;
    }

    // Do not use event.keycode this is deprecated.
    // See: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
    let current: string = this.el.nativeElement.value;
    // We need this because the current value on the DOM element
    // is not yet updated with the value from this event
    let next: string = current.concat(event.key);
    if (next && !String(next).match(this.regex)) {
      event.preventDefault();
    }
  }
}

Fügen Sie OnlyNumber zu Deklarationen in app.module.ts hinzu und verwenden Sie es so überall in Ihrer App

<input OnlyNumber="true">

Gibt es eine Möglichkeit, Paste dafür zuzulassen? Außerdem habe ich die Regex geändert in: /^-?[0-9 weibl .+(\.[0-9 weibl.
Dave Nottage

2
oninput="this.value=(this.value   < Number(this.min) || this.value   > Number(this.max))  ? '' : this.value;"

2
Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen.
Sudheesh Singanamalla

Dies mag zwar die richtige Antwort sein, es fehlen jedoch genügend Details. Bitte erklären Sie, warum dies funktioniert. Bedenken Sie bei der Verwendung von Stack Overflow, dass dies eine lebendige Wissensbasis ist. Antworten, die kein Wissen teilen, sind weitaus weniger nützlich.
Marc LaFleur

2

Fügen Sie einfach eine andere Möglichkeit hinzu (mit Angular), wenn Sie den HTML-Code nicht mit noch mehr Code verschmutzen möchten:

Sie müssen nur das Feld valueChanges abonnieren und den Wert als absoluten Wert festlegen.

HTML QUELLTEXT

<form [formGroup]="myForm">
    <input type="number" formControlName="myInput"/>
</form>

TypeScript CODE (in Ihrer Komponente)

formGroup: FormGroup;

ngOnInit() { 
    this.myInput.valueChanges 
    .subscribe(() => {
        this.myInput.setValue(Math.abs(this.myInput.value), {emitEvent: false});
    });
}

get myInput(): AbstractControl {
    return this.myForm.controls['myInput'];
}

1

<input type="number" name="credit_days" pattern="[^\-]+" 
    #credit_days="ngModel" class="form-control" 
    placeholder="{{ 'Enter credit days' | translate }}" min="0" 
    [(ngModel)]="provider.credit_days"
    onkeypress="return (event.charCode == 8 || event.charCode == 0 || 
    event.charCode == 13) ? null : event.charCode >= 48 && event.charCode <= 
    57" onpaste="return false">


1

Die Antwort darauf ist nicht hilfreich. da es nur funktioniert, wenn Sie Auf- / Ab-Tasten verwenden, aber wenn Sie -11 eingeben, funktioniert es nicht. Also hier ist ein kleiner Fix, den ich benutze

dieser für ganze Zahlen

  $(".integer").live("keypress keyup", function (event) {
    //    console.log('int = '+$(this).val());
    $(this).val($(this).val().replace(/[^\d].+/, ""));
    if (event.which != 8 && (event.which < 48 || event.which > 57))
    {
        event.preventDefault();
    }
   });

Dieser, wenn Sie Preisnummern haben

        $(".numeric, .price").live("keypress keyup", function (event) {
     //    console.log('numeric = '+$(this).val());
    $(this).val($(this).val().replace(/[^0-9\,\.]/g, ''));

    if (event.which != 8 && (event.which != 44 || $(this).val().indexOf(',') != -1) && (event.which < 48 || event.which > 57)) {
        event.preventDefault();
    }
   });

0

Diese Lösung ermöglicht alle Tastaturfunktionen, einschließlich Kopieren und Einfügen mit der Tastatur. Es verhindert das Einfügen negativer Zahlen mit der Maus. Es funktioniert mit allen Browsern und der Demo auf Codepen verwendet Bootstrap und jQuery. Dies sollte mit nicht englischen Spracheinstellungen und Tastaturen funktionieren. Wenn der Browser die Erfassung von Einfügeereignissen (IE) nicht unterstützt, wird das negative Vorzeichen nach dem Ausschalten entfernt. Diese Lösung verhält sich wie der native Browser mit min = 0 type = number.

Markup:

<form>
  <input class="form-control positive-numeric-only" id="id-blah1" min="0" name="nm1" type="number" value="0" />
  <input class="form-control positive-numeric-only" id="id-blah2" min="0" name="nm2" type="number" value="0" />
</form>

Javascript

$(document).ready(function() {
  $("input.positive-numeric-only").on("keydown", function(e) {
    var char = e.originalEvent.key.replace(/[^0-9^.^,]/, "");
    if (char.length == 0 && !(e.originalEvent.ctrlKey || e.originalEvent.metaKey)) {
      e.preventDefault();
    }
  });

  $("input.positive-numeric-only").bind("paste", function(e) {
    var numbers = e.originalEvent.clipboardData
      .getData("text")
      .replace(/[^0-9^.^,]/g, "");
    e.preventDefault();
    var the_val = parseFloat(numbers);
    if (the_val > 0) {
      $(this).val(the_val.toFixed(2));
    }
  });

  $("input.positive-numeric-only").focusout(function(e) {
    if (!isNaN(this.value) && this.value.length != 0) {
      this.value = Math.abs(parseFloat(this.value)).toFixed(2);
    } else {
      this.value = 0;
    }
  });
});

0

Hier ist eine Lösung, die für ein QTY-Feld, das nur Zahlen zulässt, am besten funktioniert hat.

// Only allow numbers, backspace and left/right direction on QTY input
    if(!((e.keyCode > 95 && e.keyCode < 106) // numpad numbers
        || (e.keyCode > 47 && e.keyCode < 58) // numbers
        || [8, 9, 35, 36, 37, 39].indexOf(e.keyCode) >= 0 // backspace, tab, home, end, left arrow, right arrow
        || (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + A
        || (e.keyCode == 67 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + C
        || (e.keyCode == 88 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + X
        || (e.keyCode == 86 && (e.ctrlKey === true || e.metaKey === true)) // Ctrl/Cmd + V
    )) {
        return false;
    }

0

If Number is Negative or Positive Using ES6s Math.Sign

const num = -8;
// Old Way
num === 0 ? num : (num > 0 ? 1 : -1); // -1

// ES6 Way
Math.sign(num); // -1

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.