jQuery: metin kutuları için yalnızca "sayı" girişini kısıtlamanın en iyi yolu nedir? (ondalık noktalara izin ver)


228

Metin kutuları için yalnızca "sayı" girişini kısıtlamanın en iyi yolu nedir?

Ondalık noktalara izin veren bir şey arıyorum.

Çok fazla örnek görüyorum. Ama hangisini kullanacağına henüz karar vermediler.

Praveen Jeganathan'dan güncelleme

Eklenti yok, jQuery jQuery.isNumeric()v1.7'de kendi eklentisini uyguladı . Bkz. Https://stackoverflow.com/a/20186188/66767


3
Bu görüş tabanlı bir sorudur, ancak çok yararlıdır. Görüş temelli sorulara izin verilmelidir. Bu bilgiyi arayan kişinin sadece bunun sadece fikir tabanlı bir cevap olduğunun farkında olması gerekir. Bir ETİKET yeterlidir.
Thiago

İşte canlı demo codepedia.info
Satinder singh

Yanıtlar:


198

Güncelleme

Bunun için yeni ve çok basit bir çözüm var:

Çeşitli sayısal filtreler de dahil olmak üzere bir metin üzerinde her türlü giriş filtresini kullanmanızı sağlar <input>. Bu, Kopyala + Yapıştır, Sürükle + Bırak, klavye kısayolları, bağlam menüsü işlemleri, yazılamayan tuşlar ve tüm klavye düzenlerini doğru şekilde işler.

Bu yanıtı görün veya JSFiddle'da kendiniz deneyin .

jquery.numeric eklentisi

Jquery.numeric eklentisiyle birçok formu başarıyla uyguladım .

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

Üstelik bu, textareas ile de çalışır!

Ancak, Ctrl + A, Kopyala + ve Drag (içerik menüsü üzerinden) Yapıştır o notu + Bırak olacak değil beklenen eser olarak.

HTML 5

HTML 5 standardı için daha geniş bir destekle, yalnızca sayı girişini kısıtlamak için unsurlar için patternnitelik ve numbertür kullanabiliriz input. Bazı tarayıcılarda (özellikle Google Chrome), sayısal olmayan içeriği de yapıştırmayı kısıtlamak için çalışır. Hakkında daha fazla bilgi numberve diğer yeni giriş türleri burada bulunabilir .


5
Bu eklenti Opera'da backspace kullanmanıza izin vermez.
Darryl Hein

6
@Darryl kaynak sadece birkaç düzine satır uzunluğunda, bu yüzden emin olmak için bunu değiştirmek için önemsiz olduğundan eminim. Sadece bu eklentiyi buldum ve değiştirdim, böylece allowDecimalsadece tamsayı değerlerine izin vermek istediğimde artık bir seçenek var .. kaynak çok basit ve iyi yazılmış.
Earlz

1
Olan girdi alanlarına kopya yapıştırırken bu çalışmaz type="number".
Tallmaris

@Tallmaris, bu gerçekten çok eski bir soru ve cevap. HTML'de birçok değişiklik yapıldı ve dikkate alınması gerekir.
TheVillageIdiot

Merhaba @VillageIdiot, haklısın. (Bu muhtemelen biraz kuru) yorumda kaba ses istemiyordu :) Gerçek şu ki bazı son yorumlar gördüm, bu yüzden sadece bu, şu anda, muhtemelen için en iyi çözüm olmadığını açıklamak istedim sorun.
Tallmaris

288

Girişi kısıtlamak istiyorsanız (doğrulamanın aksine), önemli olaylarla çalışabilirsiniz. böyle bir şey:

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

Ve:

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

Bu, kullanıcının doğrulama aşamasında daha sonra değil, alfa karakterler vb. Giremeyeceğini hemen bildirir.

Yine de doğrulamak isteyeceksiniz, çünkü giriş fare ile kesilip yapıştırılarak veya büyük olayları tetiklemeyebilecek bir form otomatik tamamlayıcısı tarafından doldurulabilir.


4
+1 - Ben de aynı şeyi önerecektim. Bu onaylama biçiminin, sonunda bir kez olmak yerine, her tuş basışında gerçekleşebileceğini belirtmek çok iyi bir nokta. Ekleyeceğim tek şey, kullanıcının yazdığı şeyin reddedildiğine dair bir uyarı biçimidir. Harfleri göstermemek, çok fazla insanın klavyelerinin kırık olduğunu düşünmesini sağlayacaktır. belki de kullanıcı uygulamanızın gerçekten bir şey yaptığını bildiği sürece arka plan veya kenarlık rengini ustaca değiştirin.
nickf

kabul. tarbuilders.com bir örnek var . "kişi" yi tıklatırsanız, form kullanıcı girişini anında kontrol eder ve geçerliyse yeşil bir kenarlık ve onay işareti vardır. geçersiz -> kırmızı ve "x"
Keith Bentrup

5
Ok tuşu sorununu çözmek için bu cevaba bakınız .
Hanna

Karakterleri ve harfleri sağ fare tuşuyla tıklayıp yapıştırabileceğinizi lütfen unutmayın. Bunu düzeltmenin kolay bir yolu:$doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));});
Rens Tillmann

1
CRAP, eğer sayıları yazıyorum yani "123" ve sonra bir harf tuşuna
basarsam

102

Bunun için en iyi cevabın yukarıdaki yanıt olduğunu düşündüm.

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

ancak ok tuşlarının ve silme düğmesi imlecinin dizenin sonuna kadar bir acı olduğunu kabul ediyorum (ve bu yüzden testte bana geri atıldı)

Basit bir değişiklikle ekledim

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

Bu şekilde, metnin değiştirilmesine neden olmayacak herhangi bir tuş vuruşu varsa, onu görmezden gelin. Bununla oklara vurabilir ve sonuna kadar atlayabilirsiniz ancak sayısal olmayan herhangi bir metni silebilirsiniz.


27
Daha iyi performans için iki kez çalıştırmak yerine replace sonucuyla bir var oluşturun.
DriverDan

4
keypressgörünüşte çünkü bundan başka, bu basitleştirmek için kullanılabilir keyupve keydowntetik herhangi klavye tuş üzerinde ise keypress sadece (böylece "karakter" tuşları tetikleyicileri değil ok ve sil tuşları tetikleme). Referans için bu cevaba bakınız: stackoverflow.com/a/1367720/1298685
Ian Campbell

Birden fazla ondalık kabul ediyor. Sadece bir ondalık sayı nasıl kabul edilir. Miktar metin alanı için başvurdum. Ayrıca 12.5.6 alıyor. Bir nokta için nasıl kısıtlanır.
niru dyogi

@IanCampbell tuşa basma, kaldırılmayan bir karakter girebileceğiniz anlamına gelir. Çalışmaz. Keydown aynı şeyi yapar. Sadece keyup ile çalıştırabilirim.
15:49

54

Jquery.numeric eklentisinin yazarına bildirdiğim bazı hatalar var. Safari ve Opera'da birden çok ondalık noktaya izin verir ve Opera'da geri, ok tuşlarına veya diğer birkaç kontrol karakterine yazamazsınız. Pozitif tamsayı girdisine ihtiyacım vardı, bu yüzden sonunda sadece kendi yazımı yazdım.

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

Bu kodu kullanarak hiç 0 girmek mümkün değildir. Mac'te Chrome ve FF ile test edildi.
jaredstenquist

1
0 haneyi kabul etmek için bunu güncelledim (48 == event.which && ($ (this) .val ()> 0)) || // İlk 0 rakam yok
aljordan82

Bu harika bir çözüm ancak ondalık sayılar eksik, sadece ekleyin (46 == event.which &&! ($ (This) .val (). İçerir ("."))) ||
DiamondDrake

Hiç 0 yazılamıyor.
PJ7

47

Daha fazla eklenti yok, jQuery v1.7'de eklenmiş kendi jQuery.isNumeric () yöntemini uygulamıştır .

jQuery.isNumeric( value )

Bağımsız değişkeninin bir sayı olup olmadığını belirler.

Örnek sonuçları

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

İşte isNumeric () öğesini olay dinleyicisiyle nasıl bağlayacağınıza dair bir örnek

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

Eklenti için +1. Binlerce ayırıcıya izin vermek için hafif bir değişiklik eklemek istiyorum. Bunu yerine var v = this.value;değiştirmek var v = this.value.replace(/,/g,'');. Gibi sayılar 21,345,67.800da dikkate alınır.
maan81

Bunun sayıları nasıl kontrol ettiğini bilen var mı? Anahtar kodları veya normal ifadeleri kullanıyor mu? Farklı klavye düzenleri düşünüyorsanız önemlidir.
Christopher Grigg

2
Bu çok yakın. Ancak, bir karakter tuşunu basılı tutarsanız, onay doğru çalışmaz. Karakter "çalışır". Bunun yerine şunu deneyin: $(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });
Gwi7d31

34

Yukarıda belirtilen sayısal () eklentisi Opera'da çalışmaz (geri veya ileri tuşlarını geri alamaz, silemez ve hatta kullanamazsınız).

Aşağıdaki JQuery veya Javascript kodları mükemmel şekilde çalışır (ve sadece iki satırdır).

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]/));
}

Tabii ki bu sadece saf sayısal giriş (artı geri silme, silme, ileri / geri tuşları) içindir, ancak noktaları ve eksi karakterleri içerecek şekilde kolayca değiştirilebilir.


numpad'e de izin verilmiyor
Graham


18

Numara giriş kısıtlaması için uzun koda gerek yok, sadece bu kodu deneyin.

Aynı zamanda geçerli int & float her iki değeri de kabul eder.

Javascript Yaklaşımı

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 Yaklaşımı

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

GÜNCELLEME

Yukarıdaki cevaplar en yaygın kullanım durumu girişini sayı olarak göstermektedir.

Ancak aşağıda özel kullanım durumları için kod snippet'i verilmiştir.

  • Negatif sayılara izin verme
  • Geçersiz tuş vuruşunu kaldırmadan önce gösteriliyor.

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


14

Tuş vuruşlarını tam anlamıyla engellemek için kullandığım şey aşağıdadır. Bu yalnızca 0-9 arası sayılara ve ondalık ayırıcıya izin verir. Uygulaması kolay, çok fazla kod değil ve bir cazibe gibi çalışır:

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

Merak charCode != 46eden biri varsa, if ifadesinden kaldırarak ondalık sayıları kısıtlayabilirsiniz . Mükemmel cevap!
Gaʀʀʏ

Tam olarak, ondalıkları atlamak için charCode! = 46 kaldırdım. Teşekkürler kaleazy, bu cevap benim için harika çalıştı.
17'de msqar

3
Bu kötü bir çözümdür çünkü geri tuşu, oklar, kontrol tuşları ve diğer gerekli tuş vuruşlarını dikkate almaz.
DriverDan

Ben sadece buna benzer bir çözüm yayınladım, ama aynı zamanda geri tuşu, okları işliyor ve sabit kodlu anahtar kodları kullanmıyor. Buradan kontrol edin: stackoverflow.com/a/23468513/838608
Håvard Geithus

11

Hafif bir iyileşme olarak bu öneriye kullanabileceğiniz eklentisi Doğrulama onun ile () sayısı , rakam ve aralık yöntemleri. Örneğin, aşağıdakiler 0 ile 50 arasında pozitif bir tam sayı elde etmenizi sağlar:

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

9

Alfabelerin büyülü görünümünü ve tuşların aşağısında kaybolmasını görmüyorsunuz. Bu, fare hamurunda da çalışır.

$('#txtInt').bind('input propertychange', function () {
    $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Ondalık sayılara izin vermese de, bunu tamsayılar için en basit yöntem olarak buldum.
nickdnk

Ondalık olarak, normal ifadeyi muhtemelen şu şekilde güncelleyebilirsiniz/[^0-9.]/g
Null Head

Ondalık sayılara ihtiyacım yok. Sadece OP'nin yaptığı
içindi

8

İlk olarak jQuery kullanarak bunu çözmeyi denedim, ancak keyup kaldırılmadan hemen önce giriş alanında görünen istenmeyen karakterler (rakam olmayan) hakkında mutlu değildi.

Diğer çözümleri aradığımda bunu buldum:

Tamsayılar (negatif olmayan)

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

Kaynak: https://developer.mozilla.org/tr-TR/docs/Web/API/GlobalEventHandlers.onkeypress#Example Canlı örnek: http://jsfiddle.net/u8sZq/

Ondalık sayılar (negatif olmayan)

Tek bir ondalık basamağa izin vermek için şöyle bir şey yapabilirsiniz:

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

Kaynak: Sadece yazdı. Çalışıyor gibi görünüyor. Canlı örnek: http://jsfiddle.net/tjBsF/

Diğer özelleştirmeler

  • Daha fazla sembolün yazılmasına izin vermek için, bunları temel karakter kodu filtresi olarak işlev gören normal ifadeye ekleyin.
  • Basit bağlamsal kısıtlamalar uygulamak için giriş alanının (oToCheckField.value) geçerli içeriğine (durumuna) bakın

İlginizi çekebilecek bazı şeyler:

  • Yalnızca bir ondalık basamağa izin verilir
  • Eksi işaretine yalnızca dizenin başında konumlandırılmışsa izin verin. Bu negatif sayılara izin verir.

eksiklikleri

  • Düzeltme konumu konumu işlevin içinde kullanılamaz. Bu, uygulayabileceğiniz bağlamsal kısıtlamaları büyük ölçüde azalttı (örneğin, birbirini izleyen iki eşit sembol yok). Erişmenin en iyi yolunun ne olduğundan emin değilim.

Başlık jQuery çözümleri istedi biliyorum, ama umarım birisi yine de yararlı bulacaktır.


6

Yazı için teşekkürler Dave Aaron Smith

Yanıtınızı, sayı bölümündeki ondalık basamak ve sayıları kabul edecek şekilde düzenledim. Bu iş benim için mükemmel.

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

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

Ve bunu istediğiniz tüm girdilere uygulayın:

$('selector').ForceNumericOnly();

5

HTML5, Ekim 2015 itibarıyla CanIUse'a göre küresel tarayıcı desteği% 88 + ile giriş türü numarasını desteklemektedir.

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

Bu JQuery ile ilgili bir çözüm değildir, ancak avantaj cep telefonlarında Android klavyenin sayı girmek için optimize edilmesidir.

Alternatif olarak, giriş tipi metnini yeni "model" parametresiyle kullanmak mümkündür. HTML5 spesifikasyonlarında daha fazla ayrıntı.

Ben jquery çözüm daha iyi olduğunu düşünüyorum, çünkü bu soru sağlanan jquery çözüm binlerce ayırıcı desteklemiyor. Html5 kullanabilirsiniz.

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


4

Bu işlev aynı şeyi yapar, yukarıdaki fikirlerden bazılarını kullanır.

$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); 
});
  • görsel geri bildirimi göster (kaybolmadan önce yanlış harf görünüyor)
  • ondalık sayılara izin verir
  • birden çok "."
  • sol / sağ del vb. ile ilgili hiçbir sorunu yoktur.

4

/ * Bu benim jQuery kullanarak HTML giriş kutusunda sadece sayısal (0-9) izin nasıl çapraz tarayıcı sürümüdür ?
* /

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

  });


3

AutoNumeric'i decorplanit.com adresinden kullanabilirsiniz . Onlar sayısal yanı sıra para birimi, yuvarlama, vb için güzel bir destek var.

Birkaç css tweaks ile bir IE6 ortamında kullandım ve makul bir başarı oldu.

Örneğin, bir css sınıfı numericInputtanımlanabilir ve alanlarınızı sayısal giriş maskeleriyle süslemek için kullanılabilir.

autoNumeric web sitesinden uyarlanmıştır:

$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!

autoNumeric kesinlikle gitmenin yolu
Prethen

3

Bu sorunu çözmenin iyi bir yolu olduğunu düşünüyorum ve son derece basit:

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

Örnek: JSFiddle

Kapsanan senaryolar

Buradaki benzer önerilerin çoğu bunlardan en az birinde başarısız olur veya tüm bu senaryoları kapsamak için çok sayıda kod gerektirir.

  1. Yalnızca 1 ondalık basamağa izin verir.
  2. Verir home, endve arrowtuşları.
  3. Verir deleteve backspaceherhangi bir dizinde kullanılacak.
  4. Herhangi bir dizinde düzenlemeye izin verir (giriş normal ifadeyle eşleştiği sürece).
  5. Geçerli giriş için ctrl + v ve shift + insert'e izin verir (sağ tıklama + yapıştırma ile aynı).
  6. keyupEtkinlik kullanılmadığından metin değerini titremez .
  7. Geçersiz girişten sonra seçimi geri yükler.

Senaryolar başarısız oldu

  • 0.5Yalnızca sıfır ile başlamak ve sıfırlamak işe yaramaz. Bu, normal ifade olarak değiştirilip metin kutusu ondalık nokta ile başladığında (istenirse) başlangıcını /^[0-9]*\.?[0-9]*$/eklemek için bir bulanıklık olayı eklenerek düzeltilebilir 0. Bunu nasıl düzelteceğiniz hakkında daha iyi bir fikir için bu gelişmiş senaryoya bakın .

Eklenti

Bunu kolaylaştırmak için bu basit jquery eklentisini oluşturdum :

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

2

En iyi yol, odağı her kaybettiğinde metin kutusunun etkilerini kontrol etmektir.

Normal bir ifade kullanarak içeriğin "sayı" olup olmadığını kontrol edebilirsiniz.

Veya temelde bunu otomatik olarak yapan Validation eklentisini kullanabilirsiniz.


Normal ifade /^\d*\.{0,1 {\d+$/
Chetan S

2

Veritabanı kullanımı için bu bulma kodunu kontrol edin:

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

2

Bu, bir metin alanında tamsayı yüzde doğrulaması için az önce yaptığım bir kod parçası (Peter Mortensen / Keith Bentrup tarafından kodun bir kısmını kullanarak):

/* 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;
    }
});

Bu kod:

  • Ana sayısal tuşların ve sayısal tuş takımının kullanılmasına izin verir.
  • Shift-sayısal karakterleri hariç tuttuğunuzu doğrular (ör. #, $,%, Vb.)
  • NaN değerlerini 0 ile değiştirir
  • 100'den yüksek 100 değerle değiştirir

Umarım bu ihtiyaç sahiplerine yardımcı olur.



2

HTML5 kullanıyorsanız, doğrulama yapmak için büyük uzunluklara gitmenize gerek yoktur. Sadece kullan -

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

Step özniteliği ondalık noktanın geçerli olmasını sağlar.


2
Öyle değil, Firefox ve Opera sayısal olmayan metin girişine izin veriyor
Michael Fever

@MichaelDeMutis haklısınız, sayısal olmayan metin girişine izin veriyor ancak FF'de doğrulama başarısız oluyor (Opera'da test etme fırsatım olmadı).
Jay Blanchard

2

Caret konumunu girişte tutmanın diğer yolu:

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

Avantajları:

  1. Kullanıcı ok tuşlarını, Backspace, Delete, ...
  2. Sayıları yapıştırmak istediğinizde çalışır

Plunker: Demo çalışma



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

Bu kod bana oldukça iyi çalıştı, ben sadece bunu yapmak için en iyi yol olduğunu düşünmüyor olsa da, dönemi kullanmak için controlKeys dizisinde 46 eklemek zorunda kaldı;)


1

Bunu iyi sonuçlarla kullandım.

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

1

Bu zaten çok basit bir javascript dahili fonksiyonu var "isNaN" var.

$("#numeric").keydown(function(e){
  if (isNaN(String.fromCharCode(e.which))){ 
    return false; 
  }
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.