validation - التحقق من الأرقام العشرية في JavaScript-IsNumeric()




numbers (25)

ما هي الطريقة الأنظف والأكثر فعالية للتحقق من صحة الأرقام العشرية في جافا سكريبت؟

نقاط المكافأة لـ:

  1. وضوح. يجب أن يكون الحل نظيفًا وبسيطًا.
  2. عبر منصة.

حالات تجريبية:

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

Answers

الإجابة على @ Joel قريبة جدًا ، ولكنها ستفشل في الحالات التالية:

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

منذ بعض الوقت ، اضطررت إلى تنفيذ دالة IsNumeric ، لمعرفة ما إذا كان المتغير يحتوي على قيمة رقمية ، بغض النظر عن نوعه ، يمكن أن يكون عبارة عن String تحتوي على قيمة عددية (كان علي أن أضع في اعتبارها أيضًا الترميز الأسي ، وما إلى ذلك) ، Number الكائن ، أي شيء يمكن أن يتم تمريره إلى هذه الوظيفة ، لا أستطيع إجراء أي نوع من الافتراضات ، مع الحرص على نوع الإجبار (على سبيل المثال. +true == 1; ولكن لا ينبغي اعتبار true "numeric" ).

أعتقد أنه من الجدير مشاركة هذه المجموعة من اختبارات الوحدة +30 التي تم إجراؤها على العديد من التطبيقات الوظيفية ، وكذلك مشاركة الاختبار الذي نجح في جميع اختباراتي:

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

PS isNaN و isFinite لديها سلوك محير بسبب التحويل القسري إلى الرقم. في ES6 ، Number.isNaN & Number.isFinite بإصلاح هذه المشكلات. ضع ذلك في الاعتبار عند استخدامها.

تحديث : إليك كيفية عمل jQuery الآن (2.2-stable) :

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

تحديث : الزاوي 4.3 :

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

هذا يجب أن يعمل. بعض الوظائف المتوفرة هنا معيبة ، ويجب أيضًا أن تكون أسرع من أي وظيفة أخرى هنا.

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

شرح:

قم بإنشاء نسخة من نفسه ، ثم حوّل الرقم إلى عائم ، ثم قارن نفسه بالرقم الأصلي ، إذا كان لا يزال رقمًا ، (سواء أكان صحيحًا أم عائمًا) ، ومطابقًا للرقم الأصلي ، فهذا يعني أنه رقم بالفعل.

يعمل مع السلاسل الرقمية وكذلك الأرقام العادية. لا يعمل مع أرقام سداسية عشرية.

تحذير: استخدام على مسؤوليتك الخاصة ، أي ضمانات.



أنا أستخدم حلًا أبسط:

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

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

لم يعمل لي عندما وضعت في حالة تأهب واختبار ، وكان input.length undefined . أعتقد أنه لا يوجد خاصية للتحقق من طول صحيح. ما فعلته هو

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

انها عملت بشكل جيد.


بالنسبة لي ، هذه أفضل طريقة:

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

يمكن التحقق من قيمة عدد صحيح بواسطة:

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

هذه الطريقة أسهل وأسرع! يتم فحص جميع الاختبارات!


لمعرفة ما إذا كان المتغير يحتوي على رقم صحيح وليس مجرد سلسلة تشبه الرقم ، Number.isFinite(value)فيمكن استخدامه.

هذا جزء من اللغة منذ ES2015

أمثلة:

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

فشلت الإجابة المقبولة في الاختبار رقم 7 وأعتقد أنه بسبب تغيير رأيك. إذن هذا رد على الإجابة المقبولة ، التي أواجهها.

خلال بعض المشاريع ، احتجت إلى التحقق من صحة بعض البيانات وكن متأكدة قدر الإمكان من أنها قيمة رقمية لجافا سكريبت يمكن استخدامها في العمليات الحسابية.

jQuery ، وبعض مكتبات javascript الأخرى تتضمن بالفعل هذه الوظيفة ، وعادة ما تسمى isNumeric . هناك أيضا وظيفة على التي تم قبولها على نطاق واسع كالرد ، وهو نفس الروتين العام الذي تستخدمه المكتبات المذكورة أعلاه.

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

أولاً ، سيعود التعليمة البرمجية أعلاه إلى true إذا كانت الوسيطة عبارة عن مصفوفة للطول 1 ، وكان ذلك العنصر المفرد من النوع الذي يعتبر رقميًا بالمنطق أعلاه. في رأيي ، إذا كان مصفوفة ، فذلك ليس رقميًا.

للتخفيف من هذه المشكلة ، أضفت مراجعة لخصم المصفوفات من المنطق

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

بالطبع ، يمكنك أيضًا استخدام Array.isArray ، jquery $.isArray أو prototype Object.isArray بدلاً من Object.prototype.toString.call(n) !== '[object Array]'

كانت مشكلتي الثانية هي أن السلاسل الحرفية العددية الصحيحة السداسي العشري ("-0xA" -> -10) لم يتم حسابها كرقمية. ومع ذلك ، تم التعامل مع السلاسل الحرفية العددية السداسي الإيجابي ("0xA" -> 10) كعدد رقمية. كنت بحاجة إلى أن تكون رقمية صحيحة.

قمت بعد ذلك بتعديل المنطق لأخذ ذلك في الاعتبار.

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

إذا كنت قلقًا بشأن إنشاء التعبير المعتاد في كل مرة يتم استدعاء الدالة ، فيمكنك إعادة كتابتها داخل إغلاق ، شيء من هذا القبيل

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

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

ثم أخذت حالات اختبار CMS +30 واستنساخ الاختبار على jsfiddle وأضاف حالات الاختبار الإضافية الخاصة بي والحل الموصوف أعلاه.

قد لا يحل محل الإجابة المقبولة / المستخدمة على نطاق واسع ولكن إذا كان هذا أكثر مما تتوقعه كنتائج من الدالة الرقمية الخاصة بك ، فمن المأمول أن يكون هذا بعض المساعدة.

تحرير: كما أشار Bergi ، هناك أشياء أخرى محتملة يمكن اعتبارها رقمية وأنه سيكون من الأفضل إلى القائمة البيضاء من القائمة السوداء. مع أخذ ذلك في الاعتبار أود أن أضيف إلى المعايير.

أريد وظيفة isNumeric أن تضع في الاعتبار الأرقام أو السلاسل فقط

مع وضع هذا في الاعتبار ، سيكون من الأفضل استخدام

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(/^-/, ''));
}

اختبر الحلول

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>


أود إضافة ما يلي:

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

تبدأ الأرقام السداسيّة الموجبة بالظهور مع 0xالأرقام السداسيّة السّداسيّة -0x. تبدأ أرقام oct موجبة مع 0الأرقام الثمانية الساذجة وتبدأ -0. هذا واحد يأخذ معظم ما سبق ذكره في الاعتبار ، ولكن يشمل عرافة وأرقام ثماني ، علمية سلبية ، إنفينيتي وإزالة العلمية العشرية ( 4e3.2غير صالحة).

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

منذ jQuery 1.7 ، يمكنك استخدام api.jquery.com/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

فقط لاحظ أنه على عكس ما قلته ، 0x89f رقم صحيح (سداسي)


استخدم الوظيفة isNaN . أعتقد أنه إذا قمت بإجراء اختبار !isNaN(yourstringhere) فإنه يعمل بشكل جيد في أي من هذه الحالات.


لم يتم إرجاع أي من الإجابات falseللأوتار الفارغة ، وهو حل لذلك ...

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

نعم ، سيكون isNaN(object) المدمج isNaN(object) أسرع بكثير من أي تعبير منطقي ، لأنه مدمج ومجمع ، بدلاً من تفسيره على الطاير.

على الرغم من اختلاف النتائج إلى حد ما عما تبحث عنه ( جربه ):

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

بلدي الحل،

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

يبدو أنه يعمل في كل موقف ، لكنني قد أكون مخطئًا.


يبدو أن ما يلي يعمل بشكل جيد في العديد من الحالات:

function isNumeric(num) {
    return (num > 0 || num === 0 || num === '0' || num < 0) && num !== true && isFinite(num);
}

تم بناء هذا الجزء العلوي من هذه الإجابة (وهي لهذا الجواب أيضًا): https://.com/a/1561597/1985601


المشكلة الوحيدة التي واجهتها مع answer @ CMS هي استبعاد NaN و Infinity ، وهي أرقام مفيدة للعديد من المواقف. إحدى الطرق للتحقق من NaN هي التحقق من القيم الرقمية التي لا تساوي نفسها ، NaN != NaN ! إذاً هناك 3 اختبارات تود التعامل معها ...

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

إجابتي iscomparableNumber قريبة جداً من answer أنيقة أخرى ، ولكنها تتعامل مع سداسي عشرية وتمثيلات أخرى للأرقام.


Arrrgh! لا تستمع إلى إجابات التعبير العادي. ريجسي رديء لهذا ، وأنا لا أتحدث فقط عن الأداء. من السهل جدًا أن تجعل من الخطأ ، من المستحيل تحديد الأخطاء باستخدام تعبيرك المعتاد.

إذا لم تتمكن من استخدام isNaN() ، فيجب أن يعمل ذلك بشكل أفضل:

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

وإليك كيف يعمل:

يقوم تعبير (input - 0) بإجبار JavaScript على عمل الإجبار على قيمة الإدخال الخاصة بك؛ يجب أن يتم تفسيرها أولاً كرقم لعملية الطرح. إذا فشل هذا التحويل إلى رقم ، سيؤدي التعبير إلى NaN . ثم تتم مقارنة هذه النتيجة الرقمية بالقيمة الأصلية التي تم تمريرها بها. بما أن الجانب الأيسر أصبح الآن رقميًا ، يتم استخدام الإجبار مرة أخرى. والآن بعد أن تم إجبار المدخلات من كلا الجانبين على نفس النوع من نفس القيمة الأصلية ، فستعتقد أنه يجب أن تكون هي نفسها دائمًا (صحيح دائمًا). ومع ذلك ، هناك قاعدة خاصة تقول أن NaN لا تساوي أبدًا NaN ، وبالتالي فإن القيمة التي لا يمكن تحويلها إلى رقم (والقيم التي لا يمكن تحويلها إلى أرقام) ستؤدي إلى خطأ.

الاختيار على طول لحالة خاصة تنطوي على سلاسل فارغة. لاحظ أيضًا أنه يسقط على اختبار 0x89f الخاص بك ، ولكن ذلك يرجع إلى أنه في العديد من البيئات تكون هذه طريقة جيدة لتحديد عدد حرفي. إذا كنت تريد التقاط هذا السيناريو المحدد ، يمكنك إضافة شيك إضافي. والأفضل من ذلك ، إذا كان هذا هو السبب في عدم استخدام isNaN() فقط isNaN() الخاصة حول isNaN() التي يمكنها أيضًا إجراء الفحص الإضافي.

باختصار ، إذا كنت تريد معرفة ما إذا كان يمكن تحويل قيمة إلى رقم ، فعليًا حاول تحويله إلى رقم.

عدت وقمت ببعض الأبحاث عن سبب عدم وجود سلسلة من الفراغات البيضاء للناتج المتوقع ، وأعتقد أنني حصلت عليها الآن: يتم فرض سلسلة فارغة على 0 بدلاً من NaN . ببساطة ، قطع السلسلة قبل فحص الطول ستتعامل مع هذه الحالة.

تشغيل اختبارات الوحدة مقابل الشفرة الجديدة وفشلها فقط في اللانهاية والحروف المنطقية ، والوقت الوحيد الذي يجب أن يكون مشكلة هو إذا كنت تولد رمزًا (في الحقيقة ، من سيكتب حرفياً ويتحقق من كونه رقميًا؟ يجب أن تعرف ) ، وهذا من شأنه أن يكون بعض رمز غريب لتوليد.

ولكن ، مرة أخرى ، فإن السبب الوحيد لاستخدام هذا هو إذا كان عليك تجنب سبب عدم وجود ().


knockoutJs Inbuild وظائف التحقق من صحة المكتبة

من خلال توسيعه الحصول على التحقق من صحة الحقل

1) الرقم

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

حالة اختبار

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) رقم

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

حالة اختبار

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) دقيقة و كحد أقصى

self.number = ko.observable(numberValue) .extend ({min: 5}). expand ({max: 10}) ؛

يقبل هذا المجال القيمة بين 5 و 10 فقط

حالة اختبار

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

زوج من الاختبارات لإضافة:

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

خطرت لي هذه:

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

يغطي الحل:

  • علامة سلبية اختيارية في البداية
  • صفر واحد ، أو واحد أو أكثر من الأرقام التي لا تبدأ بالرقم 0 ، أو لا شيء طالما أن هناك فترة
  • فترة يتبعها رقم واحد أو أكثر

أدرك أن هذا قد تم الإجابة عليه عدة مرات ، ولكن ما يلي هو مرشح لائق يمكن أن يكون مفيدا في بعض السيناريوهات.

تجدر الإشارة إلى أنه يفترض أن ".42" ليس رقمًا ، و "4." ليس رقمًا ، لذا يجب مراعاة ذلك.

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

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

و isDecimalيمر الاختبار التالي:

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

تكمن الفكرة هنا في أن كل رقم أو رقم صحيح يحتوي على تمثيل سلسلة "متعارف عليه" واحد ، ويجب رفض كل تمثيل غير قانوني. لذا ، أرسلنا إلى الرقم والعودة ، ونرى ما إذا كانت النتيجة هي السلسلة الأصلية.

يعتمد ما إذا كانت هذه الوظائف مفيدة بالنسبة لك على حالة الاستخدام. ميزة واحدة هي أن السلاسل المميزة تمثل أرقامًا مميزة (إذا اجتاز كلاهما isNumber()الاختبار).

هذا هو على سبيل المثال ذات الصلة للأرقام كأسماء خصائص الكائن.

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

يمكن القيام به دون ريجسب كما

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

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

إذا كانت n رقمية Number(n)فسوف ترجع القيمة الرقمية وستعيدها toString()إلى سلسلة. ولكن إذا كان n ليس رقمي Number(n)سيعود NaNلذلك لن تتطابق مع الأصليn


هنا نسخة محسنة قليلاً من الليل (ربما أسرع طريقة للخروج) التي أستخدمها بدلاً من متغير jQuery الدقيق ، لا أعرف حقاً لماذا لا يستخدمون هذا:

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

الجانب السلبي للإصدار jQuery هو أنه إذا قمت بتمرير سلسلة مع parseFloat | parseInt الرائدة مثل "123abc" في parseFloat | parseInt parseFloat | parseInt الكسر الرقمي الخروج والعودة 123 ، ولكن ، سوف يفشل الحارس الثاني في أنه على أية حال. مع المشغل unary + سيموت على الحارس الأول منذ + يرمي NaN لمثل هذه الهجينة :) أداء قليل حتى الآن أعتقد كسب دلالة صلبة.


[تم تحديث] جمعت كل ما أعرفه حول التحقق من صحة عنوان البريد الإلكتروني هنا: http://isemail.info/ ، والذي لا يعمل الآن على التحقق من صحة المشكلات ولكن مع تشخيص عناوين البريد الإلكتروني. أوافق على العديد من التعليقات هنا بأن التحقق من الصحة ليس سوى جزء من الإجابة ؛ انظر مقالي على http://isemail.info/about .

يبقى is_email () ، بقدر ما أعرف ، المدقق الوحيد الذي سوف يخبرك بشكل نهائي ما إذا كانت سلسلة معينة عنوان بريد إلكتروني صالح أم لا. لقد قمت بتحميل إصدار جديد على http://isemail.info/

أنا جمعت حالات الاختبار من كال هندرسون ، ديف الطفل ، فيل Haack ، دوغ لوفل ، RFC5322 و RFC 3696. 275 عناوين الاختبار في كل شيء. أجريت كل هذه الاختبارات ضد جميع المدققين المجانيين الذين تمكنت من العثور عليهم.

سأحاول إبقاء هذه الصفحة محدّثة حيث يقوم الناس بتعزيز مدققيها. شكرا لكال ، مايكل ، ديف ، بول وفيل لمساعدتهم وتعاونهم في تجميع هذه الاختبارات والنقد البناء لمُصححي الخاص .

يجب أن يكون الناس على دراية بالمخططات ضد RFC 3696 على وجه الخصوص. ثلاثة من الأمثلة الأساسية هي في الواقع عناوين غير صالحة. والحد الأقصى لطول العنوان هو 254 أو 256 حرفًا وليس 320.







javascript validation numbers