JavaScriptÔÇÖde ondal─▒k say─▒lar─▒ do─črula - IsNumeric ()


Al─▒nan cevaba git


JavaScriptÔÇÖde ondal─▒k say─▒lar─▒ do─črulaman─▒n en temiz ve en etkili yolu nedir?

Bonus puanlar─▒:

  1. A├ž─▒kl─▒k. ├ç├Âz├╝m temiz ve basit olmal─▒d─▒r.
  2. Çapraz platform.

Test durumlar─▒:

 01. IsNumeric('-1')      => true
02. IsNumeric('-1.5')    => true
03. IsNumeric('0')       => true
04. IsNumeric('0.42')    => true
05. IsNumeric('.42')     => true
06. IsNumeric('99,999')  => false
07. IsNumeric('0x89f')   => false
08. IsNumeric('#abcdef') => false
09. IsNumeric('1.2.3')   => false
10. IsNumeric('')        => false
11. IsNumeric('blah')    => false
 

2306









Cevap say─▒s─▒n─▒ say: 30






@ Joel'in yan─▒t─▒ olduk├ža yak─▒n, ancak a┼ča─č─▒daki durumlarda ba┼čar─▒s─▒z olacak:

 // Whitespace strings:
IsNumeric(' ')    == true;
IsNumeric('\t\t') == true;
IsNumeric('\n\r') == true;

// Number literals:
IsNumeric(-1)  == false;
IsNumeric(0)   == false;
IsNumeric(1.1) == false;
IsNumeric(8e5) == false;
 

Bir uygulamak zorunda oldu─ču s├╝re ├Ânce IsNumeric i┼člevini de─či┼čken say─▒sal bir de─čer i├žeriyorsa, ├Â─črenmek i├žin cinsine bak─▒lmaks─▒z─▒n , bu bir olabilir String say─▒sal bir de─čer (─▒ vb, ├╝stel g├Âsterimi, dikkate almak zorunda) i├žeren bir Number nesne, hemen hemen her ┼čey bu i┼čleve ge├žebilirdi, t├╝r zorlama ile ilgilenen herhangi bir t├╝r varsay─▒mda bulunamazd─▒m (├Ârne─čin, +true == 1; ancak true dikkate al─▒nmamal─▒d─▒r "numeric" ).

├çok say─▒da fonksiyon uygulamas─▒na yap─▒lan bu +30 birim test setini payla┼čmaya de─čer oldu─čunu d├╝┼č├╝n├╝yorum ve ayr─▒ca t├╝m testlerimi ge├žen testi payla┼č─▒yor:

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

PS isNaN ve isFinite , say─▒ya zorla d├Ân├╝┼čt├╝r├╝ld├╝─č├╝ i├žin kafa kar─▒┼čt─▒r─▒c─▒ bir davran─▒┼č sergiler . ES6'da, Number.isNaN ve Number.isFinite bu sorunlar─▒ ├ž├Âzecektir. Bunlar─▒ kullan─▒rken akl─▒n─▒zda bulundurun.


G├╝ncelleme : ─░┼čte jQuery ┼čimdi nas─▒l yap─▒yor (2.2-kararl─▒) :

 isNumeric: function(obj) {
    var realStringObj = obj && obj.toString();
    return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0;
}
 

G├╝ncelleme : A├ž─▒sal 4.3 :

 export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}
 

2862







Arrrgh! D├╝zenli ifade cevaplar─▒n─▒ dinlemeyin. RegEx bunun i├žin ├žok tehlikeli ve sadece performanstan bahsetmiyorum. D├╝zenli ifadenizle hatalar─▒ tespit etmek imkans─▒z, kolay ve imkans─▒z.

Kullanamazsan─▒z isNaN() , bu ├žok daha iyi ├žal─▒┼čmas─▒ gerekir:

 function IsNumeric(input)
{
    return (input - 0) == input && (''+input).trim().length > 0;
}
 

─░┼čte nas─▒l ├žal─▒┼č─▒yor:

(input - 0) ─░fadesi, giri┼č de─čerine tip zorlama yapmak i├žin JavaScript zorlar; ├Ânce ├ž─▒karma i┼člemi i├žin bir say─▒ olarak yorumlanmal─▒d─▒r. Bir say─▒ya bu d├Ân├╝┼č├╝m ba┼čar─▒s─▒z olursa, ifade sonu├žlan─▒r NaN . Bu say─▒sal sonu├ž daha sonra girdi─činiz orijinal de─čerle kar┼č─▒la┼čt─▒r─▒l─▒r. Sol taraf ┼čimdi say─▒sal oldu─čundan, zorlama t├╝r├╝ tekrar kullan─▒l─▒r. ┼×imdi, her iki taraftan gelen girdi, ayn─▒ orijinal de─čerden ayn─▒ t├╝re zorland─▒─č─▒ndan, her zaman ayn─▒ olmas─▒ gerekti─čini d├╝┼č├╝n├╝rs├╝n├╝z (her zaman do─čru). Bununla birlikte, NaN hi├žbir zaman e┼čit olmad─▒─č─▒ s├Âylenen ├Âzel bir kural vard─▒r NaN ve bu nedenle say─▒ya d├Ân├╝┼čt├╝r├╝lemeyen bir de─čer (ve yaln─▒zca say─▒lara d├Ân├╝┼čt├╝r├╝lemeyen de─čerler) yanl─▒┼čla sonu├žlan─▒r.

Uzunluk ├╝zerindeki kontrol, bo┼č dizeleri i├žeren ├Âzel bir durum i├žindir. Ayr─▒ca, bunun 0x89f testinize d├╝┼čt├╝─č├╝n├╝ unutmay─▒n, ancak bunun nedeni ├žo─ču ortamda bunun bir say─▒ de─či┼čmezini tan─▒mlaman─▒n iyi bir yoludur. Bu ├Âzel senaryoyu yakalamak istiyorsan─▒z ek bir kontrol ekleyebilirsiniz. Daha da iyisi, kullanmaman─▒n sebebi buysa , ek isNaN() i┼člevini isNaN() de yapabilece─činiz kendi i┼člevinizi ├ževirin.

├ľzetle, bir de─čerin say─▒ya d├Ân├╝┼čt├╝r├╝l├╝p d├Ân├╝┼čt├╝r├╝lmeyece─čini bilmek istiyorsan─▒z, ger├žekte bir say─▒ya d├Ân├╝┼čt├╝rmeyi deneyin.


Geri d├Ând├╝m ve neden bir bo┼čluk dizesinin beklenen ├ž─▒kt─▒ya sahip olmad─▒─č─▒na ili┼čkin bir ara┼čt─▒rma yapt─▒m ve san─▒r─▒m ┼čimdi anl─▒yorum: bo┼č bir dize 0 yerine zorlan─▒r NaN . Uzunlu─ču kontrol etmeden ├Ânce ipi basit├že k─▒rpmak bu durumu idare eder.

Birim testlerini yeni koda kar┼č─▒ ├žal─▒┼čt─▒rmak ve yaln─▒zca sonsuzluk ve boolean de─či┼čmezler ├╝zerinde ba┼čar─▒s─▒z olur ve sorun yaratmas─▒ gereken tek zaman, kod ├╝retiyorsan─▒z (ger├žekte, de─či┼čmezi yaz─▒n ve say─▒sal olup olmad─▒─č─▒n─▒ kontrol edin)? Bilmeniz gerekir ) ve bu olu┼čturmak i├žin garip bir kod olurdu.

Fakat, yine de, bunu kullanman─▒n tek nedeni, bir nedenden ka├ž─▒nman─▒z gerekmesidir.


330







Bu yol iyi ├žal─▒┼č─▒yor gibi g├Âr├╝n├╝yor:

 function IsNumeric(input){
    var RE = /^-{0,1}\d*\.{0,1}\d+$/;
    return (RE.test(input));
}
 

Ve bunu test etmek i├žin:

 // alert(TestIsNumeric());

function TestIsNumeric(){
    var results = ''
    results += (IsNumeric('-1')?"Pass":"Fail") + ": IsNumeric('-1') => true\n";
    results += (IsNumeric('-1.5')?"Pass":"Fail") + ": IsNumeric('-1.5') => true\n";
    results += (IsNumeric('0')?"Pass":"Fail") + ": IsNumeric('0') => true\n";
    results += (IsNumeric('0.42')?"Pass":"Fail") + ": IsNumeric('0.42') => true\n";
    results += (IsNumeric('.42')?"Pass":"Fail") + ": IsNumeric('.42') => true\n";
    results += (!IsNumeric('99,999')?"Pass":"Fail") + ": IsNumeric('99,999') => false\n";
    results += (!IsNumeric('0x89f')?"Pass":"Fail") + ": IsNumeric('0x89f') => false\n";
    results += (!IsNumeric('#abcdef')?"Pass":"Fail") + ": IsNumeric('#abcdef') => false\n";
    results += (!IsNumeric('1.2.3')?"Pass":"Fail") + ": IsNumeric('1.2.3') => false\n";
    results += (!IsNumeric('')?"Pass":"Fail") + ": IsNumeric('') => false\n";
    results += (!IsNumeric('blah')?"Pass":"Fail") + ": IsNumeric('blah') => false\n";

    return results;
}
 

Bu regex'i http://www.codetoad.com/javascript/isnumeric.asp adresinden ├Âd├╝n├ž ald─▒m . A├ž─▒klama:

 /^ match beginning of string
-{0,1} optional negative sign
\d* optional digits
\.{0,1} optional decimal point
\d+ at least one digit
$/ match end of string
 

65







Yahoo! UI bunu kullan─▒r:

 isNumber: function(o) {
    return typeof o === 'number' && isFinite(o);
}
 

51







 function IsNumeric(num) {
     return (num >=0 || num < 0);
}
 

Bu, 0x23 tip numaralar─▒ i├žin de ge├žerlidir.


48







Kabul edilen cevap # 7 testinizde ba┼čar─▒s─▒z oldu ve san─▒r─▒m fikrinizi de─či┼čtirdiyseniz. Yani bu benim sorunum olan kabul edilmi┼č cevab─▒n cevab─▒.

Baz─▒ projeler s─▒ras─▒nda baz─▒ verileri do─črulamam gerekiyordu ve bunun m├╝mk├╝n oldu─ču kadar matematiksel i┼člemlerde kullan─▒labilecek bir javascript say─▒sal de─čeri oldu─čuna emin olmam gerekiyordu.

jQuery ve di─čer baz─▒ javascript k├╝t├╝phaneleri zaten genellikle denilen b├Âyle bir fonksiyon i├žerir isNumeric . Yukar─▒da belirtilen k├╝t├╝phanelerin kulland─▒─č─▒ genel rutinin yan─▒ s─▒ra, cevap olarak geni┼č ├žapta kabul g├Âren y─▒─č─▒n ak─▒┼č─▒ ├╝zerine bir yaz─▒ da vard─▒r .

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

─░lk olarak, e─čer arg├╝man 1 uzunlu─čunda bir dizi olsayd─▒ ve bu tek eleman yukar─▒daki mant─▒k taraf─▒ndan say─▒sal say─▒lan bir t├╝rde olsayd─▒, yukar─▒daki kod do─čru olur. Bana g├Âre, e─čer bir dizi ise, o zaman say─▒sal de─čildir.

Bu sorunu hafifletmek i├žin, mant─▒ktan dizileri indirim i├žin bir ├žek ekledim

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

Tabii ki, yerine Array.isArray , jquery $.isArray veya prototip kullanabilirsiniz Object.isArray Object.prototype.toString.call(n) !== '[object Array]'

─░kinci sorunum Negatif Onalt─▒l─▒k tamsay─▒ de─či┼čmez dizgilerinin ("-0xA" -> -10) say─▒sal olarak say─▒lmad─▒─č─▒yd─▒. Ancak, Pozitif Onalt─▒l─▒k tamsay─▒ de─či┼čmez dizeleri ("0xA" -> 10) say─▒sal olarak kabul edildi. ─░kisinin de ge├žerli bir say─▒sal olmas─▒ gerekiyordu.

Daha sonra bunu dikkate almak i├žin mant─▒─č─▒ de─či┼čtirdim.

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

─░┼člev her ├ža─čr─▒ld─▒─č─▒nda regex'in yarat─▒lmas─▒ konusunda endi┼čeleniyorsan─▒z, bir kapatma i├žinde yeniden yazabilirsiniz, bunun gibi bir ┼čey

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

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

Daha sonra CMS +30 test senaryolar─▒ ald─▒m ve jsfiddle testini klonlad─▒m, ekstra test durumlar─▒m─▒ ve yukar─▒da a├ž─▒klanan ├ž├Âz├╝m├╝m├╝ ekledim.

Yayg─▒n olarak kabul edilen / kullan─▒lan cevab─▒ de─či┼čtirmeyebilir, ancak bu isNumeric fonksiyonunuzdan bekledi─činiz ┼čeylerden fazlas─▒ysa, umar─▒m bu biraz yard─▒mc─▒ olacakt─▒r.

EDIT: Bergi'nin belirtti─či gibi , say─▒sal say─▒labilecek ba┼čka olas─▒ nesneler var ve beyaz listeden kara listeden daha iyi olurdu. Bunu ak─▒lda tutarak kriterlere eklerdim.

─░sNumeric i┼člevimin yaln─▒zca Say─▒ veya Dizeleri dikkate almas─▒n─▒ istiyorum

Bu ak─▒lda, kullanmak 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(/^-/, ''));
}
 

├ç├Âz├╝mleri test edin

 var testHelper = function() {

  var testSuite = function() {
    test("Integer Literals", function() {
      ok(isNumber("-10"), "Negative integer string");
      ok(isNumber("0"), "Zero string");
      ok(isNumber("5"), "Positive integer string");
      ok(isNumber(-16), "Negative integer number");
      ok(isNumber(0), "Zero integer number");
      ok(isNumber(32), "Positive integer number");
      ok(isNumber("040"), "Octal integer literal string");
      ok(isNumber(0144), "Octal integer literal");
      ok(isNumber("-040"), "Negative Octal integer literal string");
      ok(isNumber(-0144), "Negative Octal integer literal");
      ok(isNumber("0xFF"), "Hexadecimal integer literal string");
      ok(isNumber(0xFFF), "Hexadecimal integer literal");
      ok(isNumber("-0xFF"), "Negative Hexadecimal integer literal string");
      ok(isNumber(-0xFFF), "Negative Hexadecimal integer literal");
    });

    test("Foating-Point Literals", function() {
      ok(isNumber("-1.6"), "Negative floating point string");
      ok(isNumber("4.536"), "Positive floating point string");
      ok(isNumber(-2.6), "Negative floating point number");
      ok(isNumber(3.1415), "Positive floating point number");
      ok(isNumber(8e5), "Exponential notation");
      ok(isNumber("123e-2"), "Exponential notation string");
    });

    test("Non-Numeric values", function() {
      equals(isNumber(""), false, "Empty string");
      equals(isNumber("        "), false, "Whitespace characters string");
      equals(isNumber("\t\t"), false, "Tab characters string");
      equals(isNumber("abcdefghijklm1234567890"), false, "Alphanumeric character string");
      equals(isNumber("xabcdefx"), false, "Non-numeric character string");
      equals(isNumber(true), false, "Boolean true literal");
      equals(isNumber(false), false, "Boolean false literal");
      equals(isNumber("bcfed5.2"), false, "Number with preceding non-numeric characters");
      equals(isNumber("7.2acdgs"), false, "Number with trailling non-numeric characters");
      equals(isNumber(undefined), false, "Undefined value");
      equals(isNumber(null), false, "Null value");
      equals(isNumber(NaN), false, "NaN value");
      equals(isNumber(Infinity), false, "Infinity primitive");
      equals(isNumber(Number.POSITIVE_INFINITY), false, "Positive Infinity");
      equals(isNumber(Number.NEGATIVE_INFINITY), false, "Negative Infinity");
      equals(isNumber(new Date(2009, 1, 1)), false, "Date object");
      equals(isNumber(new Object()), false, "Empty object");
      equals(isNumber(function() {}), false, "Instance of a function");
      equals(isNumber([]), false, "Empty Array");
      equals(isNumber(["-10"]), false, "Array Negative integer string");
      equals(isNumber(["0"]), false, "Array Zero string");
      equals(isNumber(["5"]), false, "Array Positive integer string");
      equals(isNumber([-16]), false, "Array Negative integer number");
      equals(isNumber([0]), false, "Array Zero integer number");
      equals(isNumber([32]), false, "Array Positive integer number");
      equals(isNumber(["040"]), false, "Array Octal integer literal string");
      equals(isNumber([0144]), false, "Array Octal integer literal");
      equals(isNumber(["-040"]), false, "Array Negative Octal integer literal string");
      equals(isNumber([-0144]), false, "Array Negative Octal integer literal");
      equals(isNumber(["0xFF"]), false, "Array Hexadecimal integer literal string");
      equals(isNumber([0xFFF]), false, "Array Hexadecimal integer literal");
      equals(isNumber(["-0xFF"]), false, "Array Negative Hexadecimal integer literal string");
      equals(isNumber([-0xFFF]), false, "Array Negative Hexadecimal integer literal");
      equals(isNumber([1, 2]), false, "Array with more than 1 Positive interger number");
      equals(isNumber([-1, -2]), false, "Array with more than 1 Negative interger number");
    });
  }

  var functionsToTest = [

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

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

    function(n) {
      return !isNaN((n));
    },

    function(n) {
      return !isNaN(parseFloat(n));
    },

    function(n) {
      return typeof(n) != "boolean" && !isNaN(n);
    },

    function(n) {
      return parseFloat(n) === Number(n);
    },

    function(n) {
      return parseInt(n) === Number(n);
    },

    function(n) {
      return !isNaN(Number(String(n)));
    },

    function(n) {
      return !isNaN(+('' + n));
    },

    function(n) {
      return (+n) == n;
    },

    function(n) {
      return n && /^-?\d+(\.\d+)?$/.test(n + '');
    },

    function(n) {
      return isFinite(Number(String(n)));
    },

    function(n) {
      return isFinite(String(n));
    },

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

    function(n) {
      return parseFloat(n) == n;
    },

    function(n) {
      return (n - 0) == n && n.length > 0;
    },

    function(n) {
      return typeof n === 'number' && isFinite(n);
    },

    function(n) {
      return !Array.isArray(n) && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
    }

  ];


  // Examines the functionsToTest array, extracts the return statement of each function
  // and fills the toTest select element.
  var fillToTestSelect = function() {
    for (var i = 0; i < functionsToTest.length; i++) {
      var f = functionsToTest[i].toString();
      var option = /[\s\S]*return ([\s\S]*);/.exec(f)[1];
      $("#toTest").append('<option value="' + i + '">' + (i + 1) + '. ' + option + '</option>');
    }
  }

  var performTest = function(functionNumber) {
    reset(); // Reset previous test
    $("#tests").html(""); //Clean test results
    isNumber = functionsToTest[functionNumber]; // Override the isNumber global function with the one to test
    testSuite(); // Run the test

    // Get test results
    var totalFail = 0;
    var totalPass = 0;
    $("b.fail").each(function() {
      totalFail += Number($(this).html());
    });
    $("b.pass").each(function() {
      totalPass += Number($(this).html());
    });
    $("#testresult").html(totalFail + " of " + (totalFail + totalPass) + " test failed.");

    $("#banner").attr("class", "").addClass(totalFail > 0 ? "fail" : "pass");
  }

  return {
    performTest: performTest,
    fillToTestSelect: fillToTestSelect,
    testSuite: testSuite
  };
}();


$(document).ready(function() {
  testHelper.fillToTestSelect();
  testHelper.performTest(0);

  $("#toTest").change(function() {
    testHelper.performTest($(this).children(":selected").val());
  });
}); 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script src="https://rawgit.com/Xotic750/testrunner-old/master/testrunner.js" type="text/javascript"></script>
<link href="https://rawgit.com/Xotic750/testrunner-old/master/testrunner.css" rel="stylesheet" type="text/css">
<h1>isNumber Test Cases</h1>

<h2 id="banner" class="pass"></h2>

<h2 id="userAgent">Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11</h2>

<div id="currentFunction"></div>

<div id="selectFunction">
  <label for="toTest" style="font-weight:bold; font-size:Large;">Select function to test:</label>
  <select id="toTest" name="toTest">
  </select>
</div>

<div id="testCode"></div>

<ol id="tests">
  <li class="pass">
    <strong>Integer Literals <b style="color:black;">(0, 10, 10)</b></strong>

    <ol style="display: none;">
      <li class="pass">Negative integer string</li>

      <li class="pass">Zero string</li>

      <li class="pass">Positive integer string</li>

      <li class="pass">Negative integer number</li>

      <li class="pass">Zero integer number</li>

      <li class="pass">Positive integer number</li>

      <li class="pass">Octal integer literal string</li>

      <li class="pass">Octal integer literal</li>

      <li class="pass">Hexadecimal integer literal string</li>

      <li class="pass">Hexadecimal integer literal</li>
    </ol>
  </li>

  <li class="pass">
    <strong>Foating-Point Literals <b style="color:black;">(0, 6, 6)</b></strong>

    <ol style="display: none;">
      <li class="pass">Negative floating point string</li>

      <li class="pass">Positive floating point string</li>

      <li class="pass">Negative floating point number</li>

      <li class="pass">Positive floating point number</li>

      <li class="pass">Exponential notation</li>

      <li class="pass">Exponential notation string</li>
    </ol>
  </li>

  <li class="pass">
    <strong>Non-Numeric values <b style="color:black;">(0, 18, 18)</b></strong>

    <ol style="display: none;">
      <li class="pass">Empty string: false</li>

      <li class="pass">Whitespace characters string: false</li>

      <li class="pass">Tab characters string: false</li>

      <li class="pass">Alphanumeric character string: false</li>

      <li class="pass">Non-numeric character string: false</li>

      <li class="pass">Boolean true literal: false</li>

      <li class="pass">Boolean false literal: false</li>

      <li class="pass">Number with preceding non-numeric characters: false</li>

      <li class="pass">Number with trailling non-numeric characters: false</li>

      <li class="pass">Undefined value: false</li>

      <li class="pass">Null value: false</li>

      <li class="pass">NaN value: false</li>

      <li class="pass">Infinity primitive: false</li>

      <li class="pass">Positive Infinity: false</li>

      <li class="pass">Negative Infinity: false</li>

      <li class="pass">Date object: false</li>

      <li class="pass">Empty object: false</li>

      <li class="pass">Instance of a function: false</li>
    </ol>
  </li>
</ol>

<div id="main">
  This page contains tests for a set of isNumber functions. To see them, take a look at the source.
</div>

<div>
  <p class="result">Tests completed in 0 milliseconds.
    <br>0 tests of 0 failed.</p>
</div> 


46







Evet, yerle┼čik isNaN(object) t├╝m regex ayr─▒┼čt─▒rma i┼člemlerinden ├žok daha h─▒zl─▒ olacakt─▒r, ├ž├╝nk├╝ an─▒nda yorumlanmak yerine yerle┼čik ve derlenmi┼č durumdad─▒r.

Sonu├žlar, arad─▒klar─▒n─▒zdan biraz farkl─▒ olsa da ( deneyin ):

                                               // IS NUMERIC
document.write(!isNaN('-1') + "<br />");      // true
document.write(!isNaN('-1.5') + "<br />");    // true
document.write(!isNaN('0') + "<br />");       // true
document.write(!isNaN('0.42') + "<br />");    // true
document.write(!isNaN('.42') + "<br />");     // true
document.write(!isNaN('99,999') + "<br />");  // false
document.write(!isNaN('0x89f') + "<br />");   // true
document.write(!isNaN('#abcdef') + "<br />"); // false
document.write(!isNaN('1.2.3') + "<br />");   // false
document.write(!isNaN('') + "<br />");        // true
document.write(!isNaN('blah') + "<br />");    // false
 

33







─░┼člevi kullan─▒n isNaN . Bunu test edersen !isNaN(yourstringhere) , bu durumlardan herhangi biri i├žin iyi sonu├ž verirse inan─▒yorum .


16







JQuery 1.7'den beri ┼čunlar─▒ kullanabilirsiniz jQuery.isNumeric() :

 $.isNumeric('-1');      // true
$.isNumeric('-1.5');    // true
$.isNumeric('0');       // true
$.isNumeric('0.42');    // true
$.isNumeric('.42');     // true
$.isNumeric('0x89f');   // true (valid hexa number)
$.isNumeric('99,999');  // false
$.isNumeric('#abcdef'); // false
$.isNumeric('1.2.3');   // false
$.isNumeric('');        // false
$.isNumeric('blah');    // false
 

Sadece s├Âylediklerinizden farkl─▒ olarak 0x89f ge├žerli bir say─▒ oldu─čuna dikkat edin (hexa)


15







RegExp olmadan yap─▒labilir.

 function IsNumeric(data){
    return parseFloat(data)==data;
}
 

11







Orijinal sorunun jQuery'den bahsetmedi─čini fark ettim, ancak jQuery kullan─▒yorsan─▒z ┼čunlar─▒ yapabilirsiniz:

 $.isNumeric(val)
 

Basit.

https://api.jquery.com/jQuery.isNumeric/ (jQuery 1.7 itibariyle)


7







 return (input - 0) == input && input.length > 0;
 

benim i├žin i┼če yaramad─▒. Uyar─▒ verdi─čimde ve test input.length edildi─čimde ├Âyleydi undefined . Tamsay─▒ uzunlu─čunu kontrol etmek i├žin hi├žbir ├Âzellik oldu─čunu d├╝┼č├╝n├╝yorum. Yani yapt─▒─č─▒m ┼čey

 var temp = '' + input;
return (input - 0) == input && temp.length > 0;
 

─░yi ├žal─▒┼čt─▒.


7







Yan─▒lm─▒yorsam, bu, sabitler ( Infinity , NaN ) ve i┼čaret operat├Ârleri + / - ( hari├ž , ger├žekte benim sayd─▒─č─▒m say─▒n─▒n bir par├žas─▒ olmad─▒─č─▒ndan, ayr─▒ operat├Ârler olduklar─▒ndan ) hari├ž, ge├žerli herhangi bir JavaScript say─▒ de─čeriyle e┼čle┼čmelidir :

Bunu, bir de─čerlendirme i├žin JavaScript'e numara g├Ândermenin bir se├ženek olmad─▒─č─▒ bir belirte├ž i├žin gerekli ... Kesinlikle m├╝mk├╝n olan en k─▒sa normal ifade de─čil, ancak JavaScript'in s├Âzdiziminin daha ince inceliklerini yakalad─▒─č─▒na inan─▒yorum.

 /^(?:(?:(?:[1-9]\d*|\d)\.\d*|(?:[1-9]\d*|\d)?\.\d+|(?:[1-9]\d*|\d)) 
(?:[e]\d+)?|0[0-7]+|0x[0-9a-f]+)$/i
 

Ge├žerli numaralar ┼čunlar─▒ i├žerir:

  - 0
 - 00
 - 01
 - 10
 - 0e1
 - 0e01
 - .0
 - 0.
 - .0e1
 - 0.e1
 - 0.e00
 - 0xf
 - 0Xf
 

Ge├žersiz say─▒lar olurdu

  - 00e1
 - 01e1
 - 00.0
 - 00x0
 - .
 - .e0
 

6







@ CMS'nin cevab─▒nda ya┼čad─▒─č─▒m tek sorun NaN , bir├žok durum i├žin yararl─▒ say─▒lar olan D─▒┼člama ve Sonsuzluk'tur. NaN 'I kontrol etmenin bir yolu, kendilerine e┼čit olmayan say─▒sal de─čerleri kontrol etmektir NaN != NaN ! Bu y├╝zden u─čra┼čmak istedi─čin 3 test var ...

 function isNumber(n) {
  n = parseFloat(n);
  return !isNaN(n) || n != n;
}
function isFiniteNumber(n) {
  n = parseFloat(n);
  return !isNaN(n) && isFinite(n);
}    
function isComparableNumber(n) {
  n = parseFloat(n);
  return (n >=0 || n < 0);
}

isFiniteNumber('NaN')
false
isFiniteNumber('OxFF')
true
isNumber('NaN')
true
isNumber(1/0-1/0)
true
isComparableNumber('NaN')
false
isComparableNumber('Infinity')
true
 

─░sComparableNumber, ba┼čka bir zarif cevaba olduk├ža yak─▒n , ancak say─▒lar─▒n hex ve di─čer string g├Âsterimlerini ele al─▒yor.


6







Bana g├Âre, bu en iyi yoldur:

 isNumber : function(v){
   return typeof v === 'number' && isFinite(v);
}
 

5







A┼ča─č─▒dakileri eklemek istiyorum:

 1. IsNumeric('0x89f') => true
2. IsNumeric('075') => true 

Pozitif hex say─▒lar─▒ ile ba┼člar 0x ve negatif hex say─▒lar─▒ ile ba┼člar -0x . Pozitif ekim say─▒lar─▒ ile ba┼člar 0 ve eksi ekim say─▒lar─▒ ile ba┼člar -0 . Bu, daha ├Ânce s├Âz edilenlerin ├žo─čunu al─▒r, ancak alt─▒gen ve sekizli say─▒lar─▒, negatif bilimsel, Sonsuzlu─ču i├žerir ve ondal─▒k bilimsel 4e3.2 olan─▒ kald─▒rm─▒┼čt─▒r ( ge├žerli de─čildir).

 function IsNumeric(input){
  var RE = /^-?(0|INF|(0[1-7][0-7]*)|(0x[0-9a-fA-F]+)|((0|[1-9][0-9]*|(?=[\.,]))([\.,][0-9]+)?([eE]-?\d+)?))$/;
  return (RE.test(input));
}
 

5







Bence parseFloat i┼člevi burada t├╝m i┼čleri yapabilir. A┼ča─č─▒daki fonksiyon bu sayfadaki t├╝m testleri ge├žer isNumeric(Infinity) == true :

 function isNumeric(n) {

    return parseFloat(n) == n;
}
 

5







Eklenecek birka├ž test:

 IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false
 

Bununla geldim:

 function IsNumeric(input) {
    return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}
 

├ç├Âz├╝m ┼čunlar─▒ kapsar:

  • Ba┼člang─▒├žta iste─če ba─čl─▒ bir negatif i┼čaret
  • Tek bir s─▒f─▒r veya 0 ile ba┼člamam─▒┼č bir veya daha fazla rakam veya bir periyot devam etti─či s├╝rece hi├žbir ┼čey
  • 1 veya daha fazla say─▒ izleyen bir d├Ânem

4







Bir tamsay─▒ de─čeri ┼ču ┼čekilde do─črulanabilir:

 function isNumeric(value) {
    var bool = isNaN(+value));
    bool = bool || (value.indexOf('.') != -1);
    bool = bool || (value.indexOf(",") != -1);
    return !bool;
};
 

Bu yol daha kolay ve daha h─▒zl─▒! T├╝m testler kontrol edildi!


4







─░┼čte tam jQuery'nin varyant─▒ yerine kulland─▒─č─▒m, biraz daha geli┼čmi┼č bir versiyon (muhtemelen en h─▒zl─▒ ├ž─▒k─▒┼č yolu), neden bunu kullanm─▒yorlar bilmiyorum:

 function isNumeric(val) {
    return !isNaN(+val) && isFinite(val);
}
 

JQuery'nin versiyonunun olumsuz say─▒sal de─čerler lider ve benzeri harfleri sondaki bir dize ge├žirirseniz olmas─▒d─▒r d─▒┼čar─▒ say─▒sal k─▒sm─▒n─▒ ay─▒klamak ve 123 d├Ânmek ANCAK olacak, ikinci muhaf─▒z yine de ba┼čar─▒s─▒z olur. Unary operat├Âr├╝ ile ilk n├Âbet├ži ├Âlecek ├ž├╝nk├╝ + bu t├╝r hibritler i├žin NaN atar :) Biraz performans g├Âsterse de sa─člam bir anlamsal kazan├ž oldu─čunu d├╝┼č├╝n├╝yorum. "123abc" parseFloat | parseInt isFinite +


4







├ç├Âz├╝m├╝m,

 function isNumeric(input) {
    var number = /^\-{0,1}(?:[0-9]+){0,1}(?:\.[0-9]+){0,1}$/i;
    var regex = RegExp(number);
    return regex.test(input) && input.length>0;
}
 

Her durumda i┼če yarayacak gibi g├Âr├╝n├╝yor ama yan─▒l─▒yor olabilirim.


3







Daha basit bir ├ž├Âz├╝m kullan─▒yorum:

 function isNumber(num) {
    return parseFloat(num).toString() == num
}
 

3







Bu ├žal─▒┼čmal─▒. Burada verilen i┼člevlerin baz─▒lar─▒ kusurludur, burada da di─čer i┼člevlerden daha h─▒zl─▒ olmas─▒ gerekir.

         function isNumeric(n)
        {
            var n2 = n;
            n = parseFloat(n);
            return (n!='NaN' && n2==n);
        }
 

A├ž─▒klamas─▒:

Kendisinin bir kopyas─▒n─▒ olu┼čturun, ard─▒ndan say─▒y─▒ float'a d├Ân├╝┼čt├╝r├╝r, sonra hala bir say─▒ysa (tam say─▒ veya kayan olsun) orijinal say─▒ ile kar┼č─▒la┼čt─▒r─▒r ve orijinal say─▒ ile e┼čle┼čir, yani, bu bir say─▒d─▒r.

Say─▒sal dizgelerin yan─▒ s─▒ra d├╝z say─▒larla da ├žal─▒┼č─▒r. Onalt─▒l─▒k say─▒larla ├žal─▒┼čmaz.

Uyar─▒: kullan─▒m kendi sorumlulu─čunuzdad─▒r, garanti yok.


3







Yan─▒tlar─▒n hi├žbiri false bo┼č dizeler i├žin geri d├Ânmez , bunun i├žin bir d├╝zeltme ...

 function is_numeric(n)
{
 return (n != '' && !isNaN(parseFloat(n)) && isFinite(n));
}
 

3







Bir de─či┼čkenin ge├žerli bir say─▒ i├žerip i├žermedi─čini kontrol etmek i├žin, sadece say─▒ gibi g├Âr├╝nen bir String de─čil, Number.isFinite(value) kullan─▒labilir.

ES2015ÔÇÖten bu yana dilin bir par├žas─▒ http://www.ecma-international.org/ecma-262/6.0/%23sec-number.isfinite#sec-number.isfinite

├ľrnekler:

 Number.isFinite(Infinity)   // false
Number.isFinite(NaN)        // false
Number.isFinite(-Infinity)  // false

Number.isFinite(0)          // true
Number.isFinite(2e64)       // true

Number.isFinite('0')        // false
Number.isFinite(null)       // false
 

3







 function inNumeric(n){
   return Number(n).toString() === n;
}
 

E─čer n say─▒sal Number(n) ise, say─▒sal de─čeri d├Ând├╝recek ve toString() tekrar bir dizgeye d├Ânecektir. Ama e─čer n say─▒sal de─čilse, orijinalle e┼čle┼čmeyecek Number(n) ┼čekilde d├Âner. NaN n


3







Bunun bir├žok kez yan─▒tland─▒─č─▒n─▒ biliyorum, ancak a┼ča─č─▒daki baz─▒ senaryolarda faydal─▒ olabilecek iyi bir aday.

'.42' nin bir say─▒ DE─×─░L oldu─čunu ve '4' oldu─čunu varsayd─▒─č─▒ belirtilmelidir. bir say─▒ DE─×─░LD─░R, bu nedenle dikkate al─▒nmal─▒d─▒r.

 function isDecimal(x) {
  return '' + x === '' + +x;
}

function isInteger(x) {
  return '' + x === '' + parseInt(x);
}
 

isDecimal A┼ča─č─▒daki test ge├žer:

 function testIsNumber(f) {
  return f('-1') && f('-1.5') && f('0') && f('0.42')
    && !f('.42') && !f('99,999') && !f('0x89f')
    && !f('#abcdef') && !f('1.2.3') && !f('') && !f('blah');
}
 

Buradaki fikir, her say─▒n─▒n veya tamsay─▒n─▒n bir "kanonik" dizi temsiline sahip oldu─ču ve her kanonik olmayan g├Âsterimin reddedilmesi gerekti─čidir. B├Âylece bir say─▒ya geri d├Ând├╝k ve sonucun orijinal dize olup olmad─▒─č─▒n─▒ g├Ârelim.

Bu i┼člevlerin sizin i├žin yararl─▒ olup olmad─▒─č─▒ kullan─▒m durumuna ba─čl─▒d─▒r. Bir ├Âzellik, farkl─▒ dizelerin farkl─▒ say─▒lar─▒ temsil etmesidir (her ikisi de isNumber() testi ge├žerse ).

Bu, ├Ârne─čin nesne ├Âzellik isimleri olarak say─▒larla ilgilidir.

 var obj = {};
obj['4'] = 'canonical 4';
obj['04'] = 'alias of 4';
obj[4];  // prints 'canonical 4' to the console.
 

2







nakavtJ'ler Dahili kitapl─▒k do─črulama i┼člevleri

Geni┼čleterek alan do─črulan─▒r

1) say─▒

self.number = ko.observable(numberValue) .extend ({number: true}) ;

Test durumu

 numberValue = '0.0'    --> true
numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '-1'     --> true
numberValue = '-3.5'   --> true
numberValue = '11.112' --> true
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false
 

2) hane

self.number = ko.observable(numberValue) .extend ({digit: true}) ;

Test durumu

 numberValue = '0'      --> true
numberValue = '25'     --> true
numberValue = '0.0'    --> false
numberValue = '-1'     --> false
numberValue = '-3.5'   --> false
numberValue = '11.112' --> false
numberValue = '0x89f'  --> false
numberValue = ''       --> false
numberValue = 'sfsd'   --> false
numberValue = 'dg##$'  --> false
 

3) min ve max

self.number = ko.observable(numberValue) .extend ({min: 5}). geni┼čletmek ({max: 10}) ;

Bu alan sadece 5 ile 10 aras─▒nda bir de─čeri kabul eder.

Test durumu

 numberValue = '5'    --> true
numberValue = '6'    --> true
numberValue = '6.5'  --> true
numberValue = '9'    --> true
numberValue = '11'   --> false
numberValue = '0'    --> false
numberValue = ''    --> false
 

2







├ľzel bir ondal─▒k seti onaylaman─▒z gerekiyorsa, bu basit javascript'i kullanabilirsiniz:

http://codesheet.org/codesheet/x1kI7hAD

 <input type="text" name="date" value="" pattern="[0-9]){1,2}(\.){1}([0-9]){2}" maxlength="6" placeholder="od npr.: 16.06" onchange="date(this);" />
 

Javascript:

 function date(inputField) {        
  var isValid = /^([0-9]){1,2}(\.){1}([0-9]){2}$/.test(inputField.value);   
  if (isValid) {
    inputField.style.backgroundColor = '#bfa';
  } else {
    inputField.style.backgroundColor = '#fba';
  }
  return isValid;
}
 

2







isNumeric=(el)=>{return Boolean(parseFloat(el)) && isFinite(el)}

├çok farkl─▒ bir ┼čey yok ama Boolean yap─▒c─▒s─▒n─▒ kullanabiliriz


2