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

StackOverflow https://stackoverflow.com/questions/18082

  •  09-06-2019
  •  | 
  •  

سؤال

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

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

  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
هل كانت مفيدة؟

المحلول

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

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

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


تحديث : إليك كيفية قيام jQuery بذلك الآن (2.2-مستقر):

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

نصائح أخرى

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

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

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

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

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

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

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


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

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

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

يبدو أن هذه الطريقة تعمل بشكل جيد:

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

ولاختباره:

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

لقد اقترضت هذا التعبير العادي من http://www.codetoad.com/javascript/isnumeric.asp.توضيح:

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

ياهو!واجهة المستخدم يستخدم هذا:

isNumber: function(o) {
    return typeof o === 'number' && isFinite(o);
}
function IsNumeric(num) {
     return (num >=0 || num < 0);
}

يعمل هذا مع أرقام النوع 0x23 أيضًا.

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

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

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

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

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

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

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

وبطبيعة الحال، يمكنك أيضا استخدام Array.isArray, مسج $.isArray أو النموذج الأولي 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 أضفت حالات الاختبار الإضافية والحل الموصوف أعلاه.

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

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

أريد أن تأخذ وظيفتي 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>

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

على الرغم من أن النتائج مختلفة بعض الشيء عما تبحث عنه (جربها):

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

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

منذ الإصدار 1.7 من jQuery، يمكنك استخدام 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 هو رقم صالح (سداسي)

يمكن أن يتم ذلك بدون RegExp as

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

أدرك أن السؤال الأصلي لم يذكر jQuery، ولكن إذا كنت تستخدم jQuery، فيمكنك القيام بما يلي:

$.isNumeric(val)

بسيط.

https://api.jquery.com/jQuery.isNumeric/ (اعتبارًا من jQuery 1.7)

إذا لم أكن مخطئًا، فيجب أن يتطابق هذا مع أي قيمة رقم صالحة لجافا سكريبت، باستثناء الثوابت (Infinity, NaN) ومشغلي الإشارة +/- (لأنهم ليسوا في الواقع جزءًا من الرقم بقدر ما يهمني، فهم عاملون منفصلون):

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

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

تتضمن الأرقام الصالحة ما يلي:

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

ستكون الأرقام غير صالحة

 - 00e1
 - 01e1
 - 00.0
 - 00x0
 - .
 - .e0
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);
}

المشكلة الوحيدة التي أواجهها مع @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

My isComparableNumber قريب جدًا من آخر أنيق إجابة, ، ولكنه يتعامل مع تمثيلات السلسلة السداسية والأرقام الأخرى.

يمكن التحقق من القيمة الصحيحة عن طريق:

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

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

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

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

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

أود أن أضيف ما يلي:

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

تبدأ الأرقام السداسية الموجبة بـ 0x والأرقام السداسية السالبة تبدأ بـ -0x.أرقام أكتوبر الإيجابية تبدأ بـ 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));
}

بضعة اختبارات لإضافتها:

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

خطرت لي هذه:

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

يغطي الحل:

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

بلدي الحل،

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(n)
        {
            var n2 = n;
            n = parseFloat(n);
            return (n!='NaN' && n2==n);
        }

شرح:

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

إنه يعمل مع سلاسل رقمية بالإضافة إلى أرقام عادية.لا يعمل مع الأرقام السداسية العشرية.

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

لا شيء من الإجابات يعود false للسلاسل الفارغة، إصلاح لذلك ...

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

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

وهذا جزء من اللغة منذ ذلك الحينإي إس 2015

أمثلة:

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

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

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

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

تجدر الإشارة إلى أنه يفترض أن ".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.

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

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

1) رقم

self.number = ko.observable(numberValue).تمديد({ الرقم:حقيقي});

حالة اختبار

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).تمديد({ أرقام:حقيقي});

حالة اختبار

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)تمديد ({دقيقة:5}).تمديد({الحد الأقصى:10));

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

حالة اختبار

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

يمكنك تصغير هذه الوظيفة بطرق عديدة، ويمكنك أيضًا تنفيذها باستخدام تعبير عادي مخصص للقيم السلبية أو المخططات المخصصة:

$('.number').on('input',function(){
    var n=$(this).val().replace(/ /g,'').replace(/\D/g,'');
    if (!$.isNumeric(n))
        $(this).val(n.slice(0, -1))
    else
        $(this).val(n)
});
function inNumeric(n){
   return Number(n).toString() === n;
}

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

أعتقد أن وظيفة parseFloat يمكنها القيام بكل العمل هنا.تجتاز الوظيفة أدناه جميع الاختبارات في هذه الصفحة بما في ذلك isNumeric(Infinity) == true:

function isNumeric(n) {

    return parseFloat(n) == n;
}

إجابة @CMS:فشل المقتطف الخاص بك في حالات المسافات البيضاء على جهازي باستخدامnodejs.لذلك قمت بدمجها مع@جويل الجواب الى الآتى \ الى القادم \ الى الم:

is_float = function(v) {
    return !isNaN(v) && isFinite(v) &&
        (typeof(v) == 'number' || v.replace(/^\s+|\s+$/g, '').length > 0);
}

لقد قمت باختبارها مع تلك الحالات العائمة:

var t = [
        0,
        1.2123,
        '0',
        '2123.4',
        -1,
        '-1',
        -123.423,
        '-123.432',
        07,
        0xad,
        '07',
        '0xad'
    ];

وتلك الحالات التي لا تحتوي على عوامات (بما في ذلك المسافات البيضاء والكائنات/المصفوفات الفارغة):

    var t = [
        'hallo',
        [],
        {},
        'jklsd0',
        '',
        "\t",
        "\n",
        ' '
    ];

كل شيء يعمل كما هو متوقع هنا.ربما هذا يساعد.

يمكن العثور على كود المصدر الكامل لهذا هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top