jQuery: Was ist der beste Weg, um die Eingabe nur für Zahlen für Textfelder einzuschränken? (Dezimalstellen zulassen)

228

Was ist der beste Weg, um die Eingabe "nur" für Textfelder einzuschränken?

Ich suche etwas, das Dezimalstellen erlaubt.

Ich sehe viele Beispiele. Aber ich muss mich noch entscheiden, welches ich verwenden soll.

Update von Praveen Jeganathan

Keine Plugins mehr, jQuery hat jQuery.isNumeric()in Version 1.7 eigene Plugins implementiert . Siehe: https://stackoverflow.com/a/20186188/66767

wenbert
quelle
3
Dies ist eine meinungsbasierte Frage, aber sehr nützlich. Die meinungsbasierten Fragen sollten erlaubt sein. Die Person, die nach diesen Informationen sucht, muss sich nur bewusst sein, dass dies nur eine meinungsbasierte Antwort ist. Ein TAG würde ausreichen.
Thiago C. S Ventura
Hier ist ein schöner Artikel mit Live-Demo codepedia.info/…
Satinder singh

Antworten:

198

Aktualisieren

Hierfür gibt es eine neue und sehr einfache Lösung:

Sie können jede Art von Eingabefilter für einen Text verwenden <input>, einschließlich verschiedener numerischer Filter. Dadurch werden Kopieren + Einfügen, Ziehen + Ablegen, Tastaturkürzel, Kontextmenüoperationen, nicht typisierbare Tasten und alle Tastaturlayouts korrekt verarbeitet.

Sehen Sie sich diese Antwort an oder versuchen Sie es selbst auf JSFiddle .

jquery.numeric Plugin

Ich habe viele Formulare mit dem Plugin jquery.numeric erfolgreich implementiert .

$(document).ready(function(){
    $(".numeric").numeric();
});

Darüber hinaus funktioniert dies auch mit Textbereichen!

Beachten Sie jedoch, dass Strg + A, Kopieren + Einfügen (über das Kontextmenü) und Ziehen + Ablegen nicht wie erwartet funktionieren.

HTML 5

Mit einer breiteren Unterstützung des HTML 5-Standards können wir patternAttribute und numberTypen für inputElemente verwenden, um die Eingabe nur von Zahlen einzuschränken. In einigen Browsern (insbesondere Google Chrome) wird das Einfügen von nicht numerischen Inhalten ebenfalls eingeschränkt. Weitere Informationen zu numberund andere neuere Eingabetypen finden Sie hier .

TheVillageIdiot
quelle
5
Mit diesem Plugin können Sie die Rücktaste in Opera nicht verwenden.
Darryl Hein
6
@Darryl die Quelle ist nur ein paar Dutzend Zeilen lang, also bin ich sicher, dass ich sie so modifiziere, dass das trivial ist. Ich habe gerade dieses Plugin gefunden und es so geändert, dass es jetzt eine allowDecimalOption gibt, wann immer ich nur ganzzahlige Werte zulassen möchte. Die Quelle ist sehr einfach und gut geschrieben.
Earlz
1
Dies funktioniert nicht beim Einfügen in Eingabefelder von type="number".
Tallmaris
@Tallmaris das ist in der Tat eine sehr alte Frage und Antwort. Es wurden viele Änderungen an HTML vorgenommen, die berücksichtigt werden sollten.
TheVillageIdiot
Hi @TheVillageIdiot, du hast recht. Ich wollte in dem Kommentar nicht unhöflich klingen (was wahrscheinlich etwas trocken ist) :) Tatsache ist, dass ich einige aktuelle Kommentare gesehen habe, deshalb wollte ich nur klarstellen, dass dies im Moment wahrscheinlich nicht die beste Lösung für das ist Problem.
Tallmaris
288

Wenn Sie die Eingabe einschränken möchten (im Gegensatz zur Validierung), können Sie mit den Schlüsselereignissen arbeiten. etwas wie das:

<input type="text" class="numbersOnly" value="" />

Und:

jQuery('.numbersOnly').keyup(function () { 
    this.value = this.value.replace(/[^0-9\.]/g,'');
});

Dadurch wird dem Benutzer sofort mitgeteilt, dass er keine Alpha-Zeichen usw. eingeben kann, anstatt später während der Validierungsphase.

Sie möchten weiterhin validieren, da die Eingabe möglicherweise durch Ausschneiden und Einfügen mit der Maus oder möglicherweise durch einen Formular-Autovervollständiger ausgefüllt wird, der die Schlüsselereignisse möglicherweise nicht auslöst.

Keith Bentrup
quelle
4
+1 - Ich wollte dasselbe vorschlagen. Es ist sehr gut zu beachten, dass diese Form der Validierung per Tastendruck und nicht einmal am Ende erfolgen kann. Das einzige, was ich hinzufügen möchte, ist eine Art Warnung, dass das, was der Benutzer eingibt, abgelehnt wird. Wenn die Buchstaben einfach nicht angezeigt werden, denken allzu viele, dass ihre Tastatur kaputt ist. Vielleicht ändern Sie auf subtile Weise die Hintergrund- oder Rahmenfarbe. Solange der Benutzer weiß, dass Ihre App tatsächlich etwas tut.
Nickf
einverstanden. Ich habe ein Beispiel bei tarbuilders.com . Wenn Sie auf "Kontakt" klicken, überprüft das Formular die Benutzereingaben im laufenden Betrieb. Wenn dies gültig ist, gibt es einen grünen Rand und ein Häkchen. ungültig -> rot und "x"
Keith Bentrup
5
In dieser Antwort können Sie das Problem mit den Pfeiltasten beheben.
Hanna
Bitte beachten Sie, dass Sie weiterhin Zeichen und Buchstaben mit einer rechten Maustaste einfügen> einfügen können. Ein einfacher Weg, dies zu beheben, wäre:$doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));});
Rens Tillmann
1
CRAP, wenn ich Zahlen schreibe, dh "123", und dann eine Buchstabentaste drücke, dh "a", wird die Eingabe leer ...
Candlejack
102

Ich dachte, dass die beste Antwort die oben genannte war, um dies einfach zu tun.

jQuery('.numbersOnly').keyup(function () {  
    this.value = this.value.replace(/[^0-9\.]/g,''); 
});

aber ich stimme zu, dass es ein bisschen schmerzhaft ist, dass die Pfeiltasten und die Löschtaste den Cursor an das Ende der Zeichenfolge halten (und aus diesem Grund wurde es mir beim Testen zurückgeworfen)

Ich fügte in einer einfachen Änderung hinzu

$('.numbersOnly').keyup(function () {
    if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
       this.value = this.value.replace(/[^0-9\.]/g, '');
    }
});

Auf diese Weise ignorieren Sie den Text einfach, wenn ein Tastendruck nicht dazu führt, dass der Text geändert wird. Mit dieser Option können Sie Pfeile drücken und löschen, ohne zum Ende zu springen, aber nicht numerischen Text werden gelöscht.

James Nelli
quelle
27
Erstellen Sie für eine bessere Leistung eine Variable mit Ersetzungsergebnis, anstatt sie zweimal auszuführen.
DriverDan
4
keypresskönnte verwendet werden, um dies weiter zu vereinfachen, da anscheinend keyupund keydownauf jeder Tastaturtaste ausgelöst wird, während keypress nur auf "Zeichentasten" ausgelöst wird (also nicht auf dem Pfeil ausgelöst und Tasten gelöscht werden). Siehe diese Antwort als Referenz: stackoverflow.com/a/1367720/1298685
Ian Campbell
Es akzeptiert mehr als eine Dezimalstelle. Wie man nur eine Dezimalstelle akzeptiert. Ich habe ein Betragstextfeld beantragt. Es dauert auch 12.5.6. Wie man für einen Punkt einschränkt.
Niru Dyogi
@IanCampbell Tastendruck bedeutet, dass Sie zunächst ein Zeichen eingeben können, das nicht entfernt wird. Wird nicht funktionieren. Keydown macht das Gleiche. Ich kann es nur mit Keyup zum Laufen bringen.
Nickdnk
54

Das Plugin jquery.numeric enthält einige Fehler, über die ich den Autor informiert habe. Es erlaubt mehrere Dezimalstellen in Safari und Opera, und Sie können in Opera keine Rücktaste, Pfeiltasten oder mehrere andere Steuerzeichen eingeben. Ich brauchte eine positive Ganzzahl-Eingabe, also schrieb ich am Ende nur meine eigene.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});
Dave Aaron Smith
quelle
Mit diesem Code kann überhaupt keine 0 eingegeben werden. Getestet mit Chrome und FF auf Mac.
Jaredstenquist
1
Ich habe dies aktualisiert, um eine 0-stellige (48 == event.which && ($ (this) .val ()> 0)) || zu akzeptieren // Nein 0 erste Ziffer
aljordan82
Dies ist eine großartige Lösung, aber es fehlen Dezimalstellen. Fügen Sie einfach (46 == event.which &&! ($ (This) .val (). Includes ("."))) || hinzu
DiamondDrake
Kann 0 überhaupt nicht eingeben.
PJ7
47

Keine Plugins mehr, jQuery hat eine eigene jQuery.isNumeric () implementiert, die in Version 1.7 hinzugefügt wurde.

jQuery.isNumeric( value )

Bestimmt, ob das Argument eine Zahl ist.

Probenergebnisse

$.isNumeric( "-10" );     // true
$.isNumeric( 16 );        // true
$.isNumeric( 0xFF );      // true
$.isNumeric( "0xFF" );    // true
$.isNumeric( "8e5" );     // true (exponential notation string)
$.isNumeric( 3.1415 );    // true
$.isNumeric( +10 );       // true
$.isNumeric( 0144 );      // true (octal integer literal)
$.isNumeric( "" );        // false
$.isNumeric({});          // false (empty object)
$.isNumeric( NaN );       // false
$.isNumeric( null );      // false
$.isNumeric( true );      // false
$.isNumeric( Infinity );  // false
$.isNumeric( undefined ); // false

Hier ist ein Beispiel, wie Sie isNumeric () mit dem Ereignis-Listener verknüpfen

$(document).on('keyup', '.numeric-only', function(event) {
   var v = this.value;
   if($.isNumeric(v) === false) {
        //chop off the last char entered
        this.value = this.value.slice(0,-1);
   }
});
Praveen
quelle
+1 für keine Plugins. Ich möchte eine kleine Änderung hinzufügen, um Tausende von Separatoren zuzulassen. Anstelle der var v = this.value;Änderung auf var v = this.value.replace(/,/g,'');. Zahlen wie 21,345,67.800werden ebenfalls berücksichtigt.
maan81
Weiß jemand, wie dies nach Zahlen sucht? Verwendet es Schlüsselcodes oder reguläre Ausdrücke? Wichtig, wenn Sie unterschiedliche Tastaturlayouts berücksichtigen.
Christopher Grigg
2
Das ist sehr nah. Wenn Sie jedoch eine Zeichentaste gedrückt halten, wird die Prüfung nicht ordnungsgemäß ausgeführt. Der Charakter wird "rennen". Versuchen Sie stattdessen $(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });
Folgendes
34

Das oben erwähnte numerische () Plugin funktioniert in Opera nicht (Sie können die Rück- oder Vorwärtstaste nicht zurücksetzen, löschen oder sogar verwenden).

Der folgende Code in JQuery oder Javascript funktioniert einwandfrei (und es sind nur zwei Zeilen).

JQuery:

$(document).ready(function() {
    $('.key-numeric').keypress(function(e) {
            var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
            if (verified) {e.preventDefault();}
    });
});

Javascript:

function isNumeric(e)
{
    var keynum = (!window.event) ? e.which : e.keyCode;
    return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}

Dies gilt natürlich nur für rein numerische Eingaben (plus Rücktaste, Löschen, Vorwärts- / Rückwärts-Tasten), kann jedoch leicht geändert werden, um Punkte und Minuszeichen einzuschließen.

Mike Gibbs
quelle
numpad ist auch nicht erlaubt
Graham
25

Sie können das Validierungs-Plugin mit seiner number () -Methode verwenden.

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true
    }
  }
});
Dror
quelle
FYI - number () funktioniert nicht mit Exponentialzahlen.
ScottLenart
18

Der lange Code für die Einschränkung der Zahleneingabe ist nicht erforderlich. Probieren Sie einfach diesen Code aus.

Es akzeptiert auch gültige int & float beide Werte.

Javascript-Ansatz

onload =function(){ 
  var ele = document.querySelectorAll('.number-only')[0];
  ele.onkeypress = function(e) {
     if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
        return false;
  }
  ele.onpaste = function(e){
     e.preventDefault();
  }
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

jQuery-Ansatz

$(function(){

  $('.number-only').keypress(function(e) {
	if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
  })
  .on("cut copy paste",function(e){
	e.preventDefault();
  });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

AKTUALISIEREN

Die obigen Antworten gelten für den häufigsten Anwendungsfall - Validierung der Eingabe als Zahl.

Unten finden Sie jedoch das Code-Snippet für spezielle Anwendungsfälle

  • Negative Zahlen zulassen
  • Anzeigen des ungültigen Tastenanschlags vor dem Entfernen.

$(function(){
      
  $('.number-only').keyup(function(e) {
        if(this.value!='-')
          while(isNaN(this.value))
            this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
                                   .split('').reverse().join('');
    })
    .on("cut copy paste",function(e){
    	e.preventDefault();
    });

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />

vinayakj
quelle
14

Unten ist, was ich benutze, um die Tastenanschläge buchstäblich zu blockieren. Dies erlaubt nur Zahlen 0-9 und einen Dezimalpunkt. Einfach zu implementieren, nicht viel Code und funktioniert wie ein Zauber:

<script>
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode;
    if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
        return false;
    } else {
        return true;
    }      
}
</script>

<input value="" onkeypress="return isNumberKey(event)">
kaleazy
quelle
Wenn sich jemand wundert, können Sie Dezimalstellen einschränken, indem Sie sie charCode != 46aus der if-Anweisung entfernen . Gute Antwort!
Gaʀʀʏ
Genau, ich habe den charCode! = 46 entfernt, um Dezimalstellen zu überspringen. Danke kaleazy, diese Antwort hat bei mir großartig funktioniert.
Msqar
3
Dies ist eine schlechte Lösung, da Rücktaste, Pfeile, Steuertasten und andere erforderliche Tastenanschläge nicht berücksichtigt werden.
DriverDan
Ich habe gerade eine Lösung veröffentlicht, die dieser ähnelt, aber auch Rücktaste und Pfeile verarbeitet und keine fest codierten Schlüsselcodes verwendet. Überprüfen Sie es hier: stackoverflow.com/a/23468513/838608
Håvard Geithus
11

Als leichte Verbesserung dieses Vorschlags können Sie das Validierungs-Plugin mit seinen Methoden für Nummer () , Ziffern und Bereich verwenden. Folgendes stellt beispielsweise sicher, dass Sie eine positive Ganzzahl zwischen 0 und 50 erhalten:

$("#myform").validate({
  rules: {
    field: {
      required: true,
      number: true,
      digits: true,
      range : [0, 50]
    }
  }
});
Brad Parks
quelle
9

Sie sehen kein magisches Aussehen und Verschwinden von Alphabeten auf der Taste. Dies funktioniert auch beim Einfügen mit der Maus.

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});
Null Kopf
quelle
Obwohl ich keine Dezimalstellen zulasse, fand ich, dass dies die einfachste Methode für ganze Zahlen ist.
Nickdnk
Für Dezimalstellen könnten Sie wahrscheinlich den regulären Ausdruck auf so etwas wie/[^0-9.]/g
Null Head
Ich brauche keine Dezimalstellen. Es war nur, weil OP tat, aber ja :)
nickdnk
8

Ich habe zuerst versucht, dies mit jQuery zu lösen, aber ich war nicht glücklich darüber, dass unerwünschte Zeichen (nicht Ziffern) tatsächlich im Eingabefeld angezeigt wurden, bevor sie beim Keyup entfernt wurden.

Auf der Suche nach anderen Lösungen habe ich Folgendes gefunden:

Ganzzahlen (nicht negativ)

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {
    return oKeyEvent.charCode === 0 ||
        /\d/.test(String.fromCharCode(oKeyEvent.charCode));
  }
</script>

<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput" 
    onkeypress="return numbersOnly(this, event);" 
    onpaste="return false;" /></p>
</form>

Quelle: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example Live-Beispiel: http://jsfiddle.net/u8sZq/

Dezimalstellen (nicht negativ)

Um einen einzelnen Dezimalpunkt zuzulassen, können Sie Folgendes tun:

<script>
  function numbersOnly(oToCheckField, oKeyEvent) {        
    var s = String.fromCharCode(oKeyEvent.charCode);
    var containsDecimalPoint = /\./.test(oToCheckField.value);
    return oKeyEvent.charCode === 0 || /\d/.test(s) || 
        /\./.test(s) && !containsDecimalPoint;
  }
</script>

Quelle: Hab das gerade geschrieben. Scheint zu funktionieren. Live-Beispiel: http://jsfiddle.net/tjBsF/

Andere Anpassungen

  • Um mehr Symbole eingeben zu können, fügen Sie diese einfach dem regulären Ausdruck hinzu, der als grundlegender Zeichencodefilter fungiert.
  • Um einfache kontextbezogene Einschränkungen zu implementieren, überprüfen Sie den aktuellen Inhalt (Status) des Eingabefelds (oToCheckField.value).

Einige Dinge, an denen Sie interessiert sein könnten:

  • Nur ein Dezimalpunkt erlaubt
  • Minuszeichen nur zulassen, wenn am Anfang der Zeichenfolge positioniert. Dies würde negative Zahlen ermöglichen.

Mängel

  • Die Caret-Position ist innerhalb der Funktion nicht verfügbar. Dies hat die kontextbezogenen Einschränkungen, die Sie implementieren können, erheblich reduziert (z. B. keine zwei gleichen aufeinanderfolgenden Symbole). Ich bin mir nicht sicher, wie ich am besten darauf zugreifen kann.

Ich weiß, dass der Titel nach jQuery-Lösungen fragt, aber hoffentlich findet jemand dies trotzdem nützlich.

Håvard Geithus
quelle
6

Danke für den Beitrag Dave Aaron Smith

Ich habe Ihre Antwort so bearbeitet, dass sie Dezimalstellen und Zahlen aus dem Zahlenbereich akzeptiert. Diese Arbeit ist perfekt für mich.

$(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section 
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      (96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});
Lekshmi
quelle
6
   window.jQuery.fn.ForceNumericOnly =
       function () {

           return this.each(function () {
               $(this).keydown(function (event) {
                   // Allow: backspace, delete, tab, escape, and enter
                   if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                       // Allow: Ctrl+A
                       (event.keyCode == 65 && event.ctrlKey === true) ||
                       // Allow: home, end, left, right
                       (event.keyCode >= 35 && event.keyCode <= 39)) {
                       // let it happen, don't do anything
                       return;
                   } else {
                       // Ensure that it is a number and stop the keypress
                       if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
                           event.preventDefault();
                       }
                   }
               });
           });
       };

Und wenden Sie dies auf alle gewünschten Eingaben an:

$('selector').ForceNumericOnly();
David Freire
quelle
5

HTML5 unterstützt die Eingabetypnummer mit einer globalen Browserunterstützung von 88% + laut CanIUse ab Oktober 2015.

<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />

Dies ist keine JQuery-bezogene Lösung, aber der Vorteil ist, dass auf Mobiltelefonen die Android-Tastatur für die Eingabe von Zahlen optimiert wird.

Alternativ ist es möglich, Text vom Eingabetyp mit dem neuen Parameter "Muster" zu verwenden. Weitere Details in der HTML5-Spezifikation.

Ich denke, es ist besser als jquery-Lösung, da in dieser Frage vorausgesetzt, jquery-Lösung nicht Tausende Trennzeichen unterstützen. Wenn Sie HTML5 verwenden können.

JSFiddle: https://jsfiddle.net/p1ue8qxj/

Mladen Adamovic
quelle
4

Diese Funktion macht dasselbe und verwendet einige der oben genannten Ideen.

$field.keyup(function(){
    var val = $j(this).val();
    if(isNaN(val)){
         val = val.replace(/[^0-9\.]/g,'');
         if(val.split('.').length>2) val =val.replace(/\.+$/,"");
    }
    $j(this).val(val); 
});
  • visuelles Feedback anzeigen (falscher Buchstabe wird angezeigt, bevor er verschwindet)
  • erlaubt Dezimalstellen
  • fängt mehrere "."
  • hat keine Probleme mit left / right del etc.
mordy
quelle
4

/ * Dies ist meine browserübergreifende Version von Wie kann ich mit jQuery nur numerische (0-9) in HTML-Eingabefeldern zulassen?
* /

$("#inputPrice").keydown(function(e){
    var keyPressed;
    if (!e) var e = window.event;
    if (e.keyCode) keyPressed = e.keyCode;
    else if (e.which) keyPressed = e.which;
    var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
    if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
             // Allow: Ctrl+A
            (keyPressed == 65 && e.ctrlKey === true) ||
             // Allow: home, end, left, right
            (keyPressed >= 35 && keyPressed <= 39)) {
                 // let it happen, don't do anything
                 return;
        }
        else {
            // Ensure that it is a number and stop the keypress
            if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
                e.preventDefault();
            }
        }

  });
Roger
quelle
3

Führen Sie den Inhalt einfach über parseFloat () aus. Es wird NaNbei ungültiger Eingabe zurückgegeben.

Maciej Łebkowski
quelle
3

Sie können autoNumeric von decorplanit.com verwenden . Sie haben eine gute Unterstützung für numerische sowie Währung, Rundung usw.

Ich habe in einer IE6-Umgebung mit wenigen CSS-Verbesserungen verwendet, und es war ein vernünftiger Erfolg.

Beispielsweise könnte eine CSS-Klasse numericInputdefiniert und zum Dekorieren Ihrer Felder mit den numerischen Eingabemasken verwendet werden.

angepasst von der autoNumeric Website:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!
Keine Ablenkung
quelle
AutoNumeric ist definitiv der richtige Weg
Prethen
3

Ich denke, dies ist eine gute Möglichkeit, dieses Problem zu lösen, und es ist äußerst einfach:

$(function() {
    var pastValue, pastSelectionStart, pastSelectionEnd;

    $("input").on("keydown", function() {
        pastValue          = this.value;
        pastSelectionStart = this.selectionStart;
        pastSelectionEnd   = this.selectionEnd;
    }).on("input propertychange", function() {
        var regex = /^[0-9]+\.?[0-9]*$/;

        if (this.value.length > 0 && !regex.test(this.value)) {
            this.value          = pastValue;
            this.selectionStart = pastSelectionStart;
            this.selectionEnd   = pastSelectionEnd;
        }
    });
});

Beispiel: JSFiddle

Abgedeckte Szenarien

Die meisten ähnlichen Empfehlungen schlagen hier mindestens eine dieser Empfehlungen fehl oder erfordern viel Code, um alle diese Szenarien abzudecken.

  1. Erlaubt nur 1 Dezimalpunkt.
  2. Ermöglicht home, endund die arrowTasten.
  3. Ermöglicht deleteund backspacekann an jedem Index verwendet werden.
  4. Ermöglicht die Bearbeitung an einem beliebigen Index (solange die Eingabe mit dem regulären Ausdruck übereinstimmt).
  5. Ermöglicht Strg + V und Umschalt + Einfügen für gültige Eingaben (dasselbe mit Rechtsklick + Einfügen).
  6. Flackert den Textwert nicht, da das keyupEreignis nicht verwendet wird.
  7. Stellt die Auswahl nach ungültiger Eingabe wieder her.

Szenarien fehlgeschlagen

  • Das Starten mit 0.5und Löschen nur der Null funktioniert nicht. Dies kann behoben werden, indem Sie den regulären Ausdruck in ändern /^[0-9]*\.?[0-9]*$/und dann ein Unschärfeereignis hinzufügen, um ein vorangestellt zu haben, 0wenn das Textfeld mit einem Dezimalpunkt beginnt (falls gewünscht). In diesem erweiterten Szenario finden Sie eine bessere Vorstellung davon, wie dies behoben werden kann.

Plugin

Ich habe dieses einfache JQuery-Plugin erstellt , um dies zu vereinfachen:

$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);
David Sherret
quelle
2

Am besten überprüfen Sie die Inhalte des Textfelds, wenn es den Fokus verliert.

Sie können mit einem regulären Ausdruck überprüfen, ob der Inhalt eine "Zahl" ist.

Oder Sie können das Validierungs-Plugin verwenden, das dies grundsätzlich automatisch erledigt.

jrharshath
quelle
Der reguläre Ausdruck wäre /^\d*\.{0,1}\d+$/
Chetan Sastry
2

Überprüfen Sie diesen Suchcode für die Verwendung in der Datenbank:

function numonly(root){
    >>var reet = root.value;
    var arr1 = reet.length;
    var ruut = reet.charAt(arr1-1);
    >>>if (reet.length > 0){
        var regex = /[0-9]|\./;
        if (!ruut.match(regex)){
            var reet = reet.slice(0, -1);
            $(root).val(reet);
        >>>>}
    }
}
//Then use the even handler onkeyup='numonly(this)'
Alex Homm
quelle
2

Dies ist ein Ausschnitt, den ich gerade gemacht habe (unter Verwendung eines Teils des Codes von Peter Mortensen / Keith Bentrup) für eine ganzzahlige prozentuale Validierung in einem Textfeld (jQuery ist erforderlich):

/* This validates that the value of the text box corresponds
 * to a percentage expressed as an integer between 1 and 100,
 * otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
    if (!isNaN(parseInt(this.value,10))) {
        this.value = parseInt(this.value);
    } else {
        this.value = 0;
    }
    this.value = this.value.replace(/[^0-9]/g, '');
    if (parseInt(this.value,10) > 100) {
        this.value = 100;
        return;
    }
});

Dieser Code:

  • Ermöglicht die Verwendung von Zifferntasten und Ziffernblock.
  • Validiert, um Shift-numerische Zeichen auszuschließen (z. B. #, $,% usw.)
  • Ersetzt NaN-Werte durch 0
  • Ersetzt durch 100 Werte über 100

Ich hoffe, das hilft den Bedürftigen.

Francisco Alvarado
quelle
2

Wenn Sie HTML5 verwenden, müssen Sie keine großen Anstrengungen unternehmen, um die Validierung durchzuführen. Benutz einfach -

<input type="number" step="any" />

Das step-Attribut ermöglicht die Gültigkeit des Dezimalpunkts.

Jay Blanchard
quelle
2
Nicht so, Firefox & Opera erlauben nicht numerische Texteingabe
Michael Fever
@MichaelDeMutis Sie haben Recht, es erlaubt nicht numerische Texteingabe, schlägt aber die Validierung in FF fehl (ich hatte keine Gelegenheit, in Opera zu testen).
Jay Blanchard
2

Andere Möglichkeit, die Caret-Position am Eingang beizubehalten:

$(document).ready(function() {
  $('.numbersOnly').on('input', function() {
    var position = this.selectionStart - 1;

    fixed = this.value.replace(/[^0-9\.]/g, '');  //remove all but number and .
    if(fixed.charAt(0) === '.')                  //can't start with .
      fixed = fixed.slice(1);

    var pos = fixed.indexOf(".") + 1;
    if(pos >= 0)
      fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', '');  //avoid more than one .

    if (this.value !== fixed) {
      this.value = fixed;
      this.selectionStart = position;
      this.selectionEnd = position;
    }
  });
});

Vorteile:

  1. Der Benutzer kann die Pfeiltasten, Rücktaste, Löschen, ... verwenden.
  2. Funktioniert, wenn Sie Zahlen einfügen möchten

Plunker: Demo funktioniert

Carlos Toledo
quelle
1

Ich habe gerade ein noch besseres Plug-In gefunden. Gibt Ihnen viel mehr Kontrolle. Angenommen, Sie haben ein DOB- Feld, in dem es numerisch sein muss, das aber auch "/" oder "-" Zeichen akzeptiert.

Es funktioniert super!

Überprüfen Sie es auf http://itgroup.com.ph/alphanumeric/ .

Bachir El Khoury
quelle
1
    $(".numeric").keypress(function(event) {
  // Backspace, tab, enter, end, home, left, right
  // We don't support the del key in Opera because del == . == 46.
  var controlKeys = [8, 9, 13, 35, 36, 37, 39];
  // IE doesn't support indexOf
  var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
  // Some browsers just don't raise events for control keys. Easy.
  // e.g. Safari backspace.
  if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
      (49 <= event.which && event.which <= 57) || // Always 1 through 9
      (48 == event.which && $(this).attr("value")) || // No 0 first digit
      isControlKey) { // Opera assigns values for control keys.
    return;
  } else {
    event.preventDefault();
  }
});

Dieser Code hat bei mir ziemlich gut funktioniert, ich musste nur die 46 im controlKeys-Array hinzufügen, um den Punkt zu verwenden, obwohl ich nicht denke, dass dies der beste Weg ist;)

Reedyseth
quelle
1

Ich habe dies mit guten Ergebnissen verwendet.

ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
    var charcode = (e.which) ? e.which : e.keyCode;
    // for decimal point
    if(!(charcode===190 || charcode===110))
    {           // for numeric keys andcontrol keys
        if (!((charcode>=33 && charcode<=57) || 
        // for numpad numeric keys
        (charcode>=96 && charcode<=105) 
        // for backspace
        || charcode==8)) 
        {
            alert("Sorry! Only numeric values allowed.");
            $("#id").val(ini);
        }
        // to include decimal point if first one has been deleted.
        if(charcode===8)
        {
            ini=ini.split("").reverse();
            if(ini[0]==".")
            a=0;                 
        }
    }
    else
    {
        if(a==1)
        {
            alert("Sorry! Second decimal point not allowed.");
            $("#id").val(ini);
        }
        a=1;
    }
    ini=$("#id").val();
});


find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes
Kaustubh
quelle
1

Dies ist sehr einfach, da wir bereits eine in Javascript eingebaute Funktion "isNaN" haben.

$("#numeric").keydown(function(e){
  if (isNaN(String.fromCharCode(e.which))){ 
    return false; 
  }
});
Jyothu
quelle