SORU
23 ŞUBAT 2013, CUMARTESİ


Geliştirilmiş bir ısnumeric() fonksiyonu?

Bazı projeler sırasında matematiksel işlemlerde kullanılan javascript sayısal değeri olan bazı verileri doğrulamak ve mümkün olduğunca emin olmak için ihtiyacım var.

DV ve bazı diğer javascript kütüphaneleri zaten böyle bir işlevi, genellikle ısnumeric adı vardır. Ayrıca yaygın cevap olarak kabul edilmiş post on stackoverflow öne kütüphaneleri kullanıyor bahsettiğimiz aynı genel rutin var.

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

Benim ilk yazı, bu konuya cevap edemedi. Sorun o vardı ile kabul edilen yazı olduğunu orada görünüyor bazı köşe durumlarda etkilenen bazı işler yaptığımı ve bu yüzden bazı değişiklikler yaptım deneyin ve kapak sorunu vardı.

İlk olarak, yukarıdaki kod ise değişken uzunlukta bir dizi tek bir eleman türü yukarıdaki mantığa göre sayısal olarak kabul ettiğini de 1 ise true döndürecektir. Eğer bir dizi ise benim fikrime göre, kendi sayısal.

Bu sorunu hafifletmek için, mantık indirim diziler için bir kontrol ekledim

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}

Tabii ki, aynı zamanda Object.prototype.toString.call(n) !== '[object Array]' yerine Array.isArray kullanabilirsiniz

DÜZENLEME:Dizi için genel bir test yansıtacak şekilde kodu değiştirdim, ya da bir WordPress kullanmak $.isArray kullanabilirsin veya Object.isArray prototip

Benim ikinci sorun, Olumsuz Onaltılık tamsayı hazır bilgi dizeleri ("-0xA" ->-10) sayısal olarak kabul ediliyordu. Ancak, Olumlu Onaltılık tamsayı hazır bilgi dizeleri ("0xA" ->10) wrere sayısal olarak değerlendirilir. Her ikisi de geçerli sayısal olmak istedim.

Ben o zaman bunu dikkate mantığı değiştirilmiş.

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}

Eğer her zaman fonksiyonu denir normal ifade oluşturma hakkında endişe duyuyorsanız, bu gibi kapanma, bir şey içinde yazabilirsiniz

isNumber = (function () {
  var rx = /^-/;

  return function (n) {
      return Object.prototype.toString.call(n) !== '[object Array]' && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, ''));
  };
}());

Ben o zaman 30 test cases testing on jsfiddle eklendi Sizin klonlanmış ekstra test davalarımı ve yukarıda açıklanan çözümüm aldı.

Her şey beklendiği gibi çalışıyor gibi görünüyor ve herhangi bir sorun yaşamadım. Gördüğünüz herhangi bir sorun, kod ya da kuramsal, var mı?

Yaygın olarak kabul edilen/kullanılan cevap yerini olmayabilir ama eğer bu ısnumeric fonksiyonu sonuç olarak beklediğiniz ne ise, umarım bu yardımcı olur.

EDİT: Bergi tarafından belirttiği gibi sayısal sayılabilecek diğer olası nesneler vardır ve kara daha beyaz daha iyi olurdu. Bu düşünceyle kriterlerine eklemek istiyorum.

Isnumeric fonksiyonu yalnızca Sayı veya Dizeleri düşünmek istiyorum

Bu düşünceyle, daha iyi olurdu

function isNumber(n) {
  return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}

Bu test 22 olarak eklendi

CEVAP
5 Mart 2013, Salı


Eğer bir dizi ise benim fikrime göre, kendi sayısal. Bu sorunu hafifletmek için, mantık indirim diziler için bir kontrol ekledim

Örneğin başka bir nesne ile bu sorun da, {toString:function(){return "1.2";}} olabilir. Hangi nesneleri sayısal olduğunu düşünüyordun? Number nesneleri? Yok?

Test başarısız bazı şeyler kara listeye çalışmak yerine, açıkça sayısal olmak istediğiniz şey beyaz. Fonksiyon, ilkel dizeleri ve sayıları almak da ne demek oluyor? Onlar için test tam olarak o zaman:

(typeof n == "string" || typeof n == "number")

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 07cadikiz07

    07cadikiz07

    17 EKİM 2007
  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • hockeywebcasts

    hockeywebcas

    31 EKİM 2012