Câu hỏi Xác thực số thập phân trong JavaScript - IsNumeric ()


Cách sạch nhất, hiệu quả nhất để xác thực số thập phân trong JavaScript là gì?

Điểm thưởng cho:

  1. Trong trẻo. Giải pháp phải sạch sẽ và đơn giản.
  2. Đa nền tảng.

Trường hợp kiểm tra:

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

2156


gốc


Chỉ cần một lưu ý 99,999 là một số hợp lệ ở Pháp, nó giống như 99.999 ở định dạng uk / us, vì vậy nếu bạn đang đọc trong một chuỗi từ nói một hình thức đầu vào thì 99,999 có thể đúng. - Re0sless
Ngoài ra kiểm tra bài đăng này và nhận xét tuyệt vời. - powtac
Dấu phẩy thập phân là tiêu chuẩn trong toàn bộ châu Âu và Nga (trừ Vương quốc Anh) - Calmarius
jQuery 1.7 đã giới thiệu jQuery.isNumeric chức năng tiện ích: api.jquery.com/jQuery.isNumeric - Ates Goral
jQuery.isNumeric sẽ thất bại trong trường hợp thử nghiệm thứ bảy của OP (IsNumeric('0x89f') => *false*). Tôi không chắc chắn nếu tôi đồng ý với trường hợp thử nghiệm này, tuy nhiên. - Tim Lehner


Các câu trả lời:


@ Câu trả lời của Joel là khá gần, nhưng nó sẽ thất bại trong các trường hợp sau:

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

Một thời gian trước, tôi phải thực hiện IsNumeric , để tìm hiểu xem biến có chứa giá trị số hay không, bất kể loại của nó, nó có thể là một String có chứa một giá trị số (tôi cũng phải xem xét ký hiệu số mũ, v.v.), Number đối tượng, hầu như bất cứ điều gì có thể được chuyển cho hàm đó, tôi không thể đưa ra bất kỳ kiểu giả định nào, chăm sóc ép buộc kiểu (ví dụ: +true == 1; nhưng true không nên được coi là "numeric").

Tôi nghĩ là đáng để chia sẻ bộ này +30 bài kiểm tra đơn vị được thực hiện cho nhiều triển khai chức năng và cũng chia sẻ một ứng dụng vượt qua tất cả các thử nghiệm của tôi:

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

P.S.  isNaN & isFinite có hành vi khó hiểu do chuyển đổi bắt buộc thành số. Trong ES6, Number.isNaN & Number.isFinite sẽ khắc phục những vấn đề này. Hãy ghi nhớ điều đó khi sử dụng chúng.


Cập nhật : Đây là cách jQuery hiện nó (2.2-ổn định):

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

Cập nhật : Góc 4:

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

2760



Câu trả lời này là chính xác. stackoverflow.com/questions/18082/… Câu trả lời của Joel là sai. Làm thế nào một câu trả lời sai có thể thu thập được nhiều phiếu bầu hơn so với câu trả lời đúng? - Arvin
điều này không thành công với các ngôn ngữ khác, nơi chúng tôi sử dụng dấu phẩy thập phân, nhưng thêm `n = n.replace (/, /,". "); ' trước khi trở về để sửa chữa nó. - Zoltan Lengyel
@ RobG, hành vi đó là cố ý, 2e308 > Number.MAX_VALUE kể từ đó 2e308 == Infinity. Nếu bạn muốn một hàm trả về true cũng cho các giá trị vô cùng âm và dương, kiểm tra hàm Số 2 bên trong bộ thử. Chúc mừng. - CMS
Nhân tiện, các bài kiểm tra đơn vị hiện đang được sử dụng bởi Dự án jQuery - CMS
jQuery hiện cũng là sử dụng việc triển khai này. - RichardTowers


Arrrgh! Đừng nghe câu trả lời biểu thức chính quy. RegEx là điều tuyệt vời cho điều này, và tôi không chỉ nói về hiệu suất. Thật dễ dàng để làm cho tinh tế, không thể phát hiện ra những sai lầm với biểu thức chính quy của bạn.

Nếu bạn không thể sử dụng isNaN(), điều này sẽ hoạt động tốt hơn nhiều:

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

Đây là cách nó hoạt động:

Các (input - 0) biểu thức buộc JavaScript phải thực hiện cưỡng chế kiểu trên giá trị đầu vào của bạn; trước tiên nó phải được hiểu là một con số cho phép toán trừ. Nếu chuyển đổi đó thành một số không thành công, biểu thức sẽ dẫn đến NaN. Điều này số kết quả sau đó được so sánh với giá trị ban đầu mà bạn đã nhập. Vì phía bên tay trái bây giờ là số, loại cưỡng chế lại được sử dụng. Bây giờ đầu vào từ cả hai bên đã bị ép buộc phải cùng loại từ cùng một giá trị ban đầu, bạn sẽ nghĩ rằng chúng phải luôn luôn giống nhau (luôn đúng). Tuy nhiên, có một quy tắc đặc biệt cho biết NaN không bao giờ bằng NaNvà do đó, một giá trị không thể chuyển đổi thành một số (và chỉ các giá trị không thể chuyển đổi thành số) sẽ dẫn đến sai.

Việc kiểm tra chiều dài là cho một trường hợp đặc biệt liên quan đến chuỗi rỗng. Cũng lưu ý rằng nó rơi xuống trên bài kiểm tra 0x89f của bạn, nhưng đó là bởi vì trong nhiều môi trường đó là một cách ổn định để xác định một chữ số. Nếu bạn muốn nắm bắt kịch bản cụ thể đó, bạn có thể thêm một kiểm tra bổ sung. Thậm chí tốt hơn, nếu đó là lý do bạn không sử dụng isNaN() sau đó chỉ cần quấn chức năng của riêng bạn isNaN() cũng có thể thực hiện kiểm tra bổ sung.

Tóm tắt, nếu bạn muốn biết nếu một giá trị có thể được chuyển đổi thành một số, thực sự cố gắng chuyển đổi nó thành một số.


Tôi đã quay lại và thực hiện một số nghiên cứu cho tại sao một chuỗi khoảng trắng không có đầu ra mong đợi, và tôi nghĩ rằng tôi nhận được nó ngay bây giờ: một chuỗi rỗng bị ép buộc 0 thay vì NaN. Đơn giản chỉ cần cắt xén chuỗi trước khi kiểm tra độ dài sẽ xử lý trường hợp này.

Chạy các bài kiểm tra đơn vị dựa vào mã mới và nó chỉ thất bại trên các ký tự vô cùng và boolean, và thời gian duy nhất là vấn đề là nếu bạn đang tạo mã (thực sự, ai sẽ gõ một chữ và kiểm tra xem nó có phải là số không? Bạn nên biết), và đó sẽ là một số mã lạ để tạo ra.

Nhưng một lần nữa, lý do duy nhất bao giờ sử dụng này là nếu vì một lý do nào đó bạn phải tránh isNaN ().


315



thậm chí tốt hơn nếu bạn chỉ cần tính đến trường hợp đặc biệt 0x89f là bọc một hàm IsNumeric () xung quanh isNaN () mà sau đó chỉ thực hiện kiểm tra đặc biệt của bạn nếu isNaN () trả về false. - Joel Coehoorn
Điều này không thành công trên các chuỗi khoảng trống, ví dụ IsNumeric(' '), IsNumeric('\n\t'), v.v. tất cả trở lại true - Crescent Fresh
Nó cũng sẽ thất bại Number chữ viết IsNumeric(5) == false; kiểm tra tập hợp các bài kiểm tra đơn vị tôi đã đăng, hàm này là số 16 trên bộ thử nghiệm. stackoverflow.com/questions/18082/… - CMS
Tôi không thể tin rằng không có ai chỉ ra việc sử dụng một biểu thức chính quy (thay thế) sau khi cảnh báo về việc không sử dụng các biểu thức chính quy ... Cấp, thay thế khoảng trắng đơn giản hơn so với phân tích số, nhưng nó vẫn chắc chắn "icky". - Patrick M
@Oriol Đó là một vấn đề lớn ... không có bản sửa lỗi bảo mật được phát hành sau ngày đó, việc tránh xa XP sẽ là một ưu tiên. - Joel Coehoorn


Cách này dường như hoạt động tốt:

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

Và để kiểm tra nó:

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

Tôi mượn regex đó từ http://www.codetoad.com/javascript/isnumeric.asp. Giải trình:

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

58



// C ALNG NÊN ĐƯỢC THÊM KẾT QUẢ KIỂM TRA CỦA BẠN + = (! IsNumeric ('-')? "Pass": "Fail") + ": IsNumeric ('-') => false \ n"; kết quả + = (! IsNumeric ('01 ')? "Pass": "Fail") + ": IsNumeric ('01') => false \ n"; kết quả + = (! IsNumeric ('- 01')? "Pass": "Fail") + ": IsNumeric ('- 01') => false \ n"; kết quả + = (! IsNumeric ('000')? "Pass": "Fail") + ": IsNumeric ('000') => false \ n"; - Dan
điều này làm gì? / ^ - {0,1} \ d * \. {0,1} \ d + $ / - call-me
có thể "{0,1}" được thay thế bằng "?", vì vậy regexp của bạn sẽ trông giống như sau: /^-?\d*\.?\d+$/? - Cloud


Yahoo! Giao diện người dùng sử dụng điều này:

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

45



Đó là kiểm tra nhiều hơn các loại biến như trái ngược với nội dung của số. Nó cũng sẽ thất bại trên các số được tạo bằng new Number(1). - alex
Như alex nói, điều này không thực sự trả lời câu hỏi đặt ra vì điều này sẽ thất bại nếu o = "1001". - Case


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

Điều này cũng làm việc với số 0x23.


44



IsNumeric(''), IsNumeric(' '), IsNumeric(true), IsNumeric(false), IsNumeric(null) trở về true thay vì false. - Oriol
Tôi đã cải thiện điều này: stackoverflow.com/a/20712631/1985601 - daniel1426


Câu trả lời được chấp nhận thất bại trong bài kiểm tra của bạn # 7 và tôi đoán đó là vì bạn đã thay đổi ý định. Vì vậy, đây là một phản ứng với câu trả lời được chấp nhận, mà tôi đã có vấn đề.

Trong một số dự án, tôi đã cần phải xác nhận một số dữ liệu và càng chắc chắn rằng nó là một giá trị số javascript có thể được sử dụng trong các phép toán.

jQuery và một số thư viện javascript khác đã bao gồm một hàm như vậy, thường được gọi là isNumeric. Cũng có một đăng trên stackoverflow đã được chấp nhận rộng rãi như là câu trả lời, cùng một thói quen chung mà các thư viện được đề cập ở trên đang sử dụng.

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

Đầu tiên, mã ở trên sẽ trả về true nếu đối số là một mảng có độ dài 1 và phần tử đơn lẻ đó thuộc loại được coi là số theo logic ở trên. Theo tôi, nếu đó là một mảng thì nó không phải là số.

Để giảm bớt vấn đề này, tôi đã thêm một kiểm tra vào mảng giảm giá từ logic

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

Tất nhiên, bạn cũng có thể sử dụng Array.isArray, jquery $.isArray hoặc nguyên mẫu Object.isArray thay vì Object.prototype.toString.call(n) !== '[object Array]'

Vấn đề thứ hai của tôi là các chuỗi số nguyên hệ thập lục phân âm ("-0xA" -> -10) không được tính là số. Tuy nhiên, chuỗi chữ số nguyên hệ thập lục phân tích cực ("0xA" -> 10) được coi là số. Tôi cần cả hai để trở thành số hợp lệ.

Sau đó tôi đã sửa đổi logic để tính đến điều này.

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

Nếu bạn đang lo lắng về việc tạo ra regex mỗi khi hàm được gọi thì bạn có thể viết lại nó trong một bao đóng, một cái gì đó như thế này

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

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

Sau đó tôi lấy CMS +30 trường hợp kiểm tra và nhân bản thử nghiệm trên jsfiddle đã thêm các trường hợp thử nghiệm bổ sung của tôi và giải pháp được mô tả ở trên của tôi.

Nó có thể không thay thế câu trả lời được chấp nhận rộng rãi / được sử dụng nhưng nếu điều này là nhiều hơn những gì bạn mong đợi là kết quả từ hàm isNumeric của bạn thì hy vọng điều này sẽ giúp ích một chút.

CHỈNH SỬA: Như được chỉ ra bởi Bergi, có những đối tượng khác có thể được coi là số và sẽ tốt hơn cho danh sách trắng hơn danh sách đen. Với điều này trong tâm trí tôi sẽ thêm vào các tiêu chí.

Tôi muốn hàm isNumeric của tôi chỉ xem xét số hoặc chuỗi

Với điều này trong tâm trí, nó sẽ là tốt hơn để sử dụng

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

Kiểm tra các giải pháp

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>


37



Đây là quan điểm của tôi về chức năng được che chắn nhất; Cái cuối cùng. Các câu trả lời chấp nhận được bao gồm có thể 99,99% của tất cả các trường hợp nhưng điều này có lẽ 100% của một) trường hợp với một chi phí nhỏ. - Samuel
Bạn quên mất "99,999" chữ "Foating-Point". Đó là một số hợp lệ ở tất cả Châu Âu exept Vương quốc Anh - Andrii Horda
Nó không bị lãng quên, nó không phải là thứ mà tôi coi là một con số theo ý nghĩa của các con số Javascript, OP cũng đã nói IsNumeric('99,999') => false - Xotic750


Vâng, tích hợp sẵn isNaN(object) sẽ nhanh hơn nhiều so với bất kỳ phân tích cú pháp regex nào, bởi vì nó được tích hợp sẵn và biên dịch, thay vì được giải thích khi đang di chuyển.

Mặc dù kết quả có phần khác với những gì bạn đang tìm kiếm (thử nó):

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

30





Kể từ jQuery 1.7, bạn có thể sử dụng 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

Chỉ cần lưu ý rằng không giống như những gì bạn nói, 0x89f là một số hợp lệ (hexa)


14



OP muốn hợp lệ số thập phân số, vì vậy jQuery isNumeric không phù hợp. Nó cũng không thành công với số lượng rất lớn. - RobG


Sử dụng hàm isNaN. Tôi tin nếu bạn kiểm tra !isNaN(yourstringhere) nó hoạt động tốt cho bất kỳ tình huống nào trong số này.


14



Lưu ý:! IsNaN (null) == true vì Số (null) == 0 - Jonathan Lonowski
if (! (x == null || isNaN (x))) cảnh báo ("isNumeric"); // Nhưng giải pháp này chấp nhận 0x40 vì vậy nó vẫn không phải là những gì op muốn. - some
Lưu ý rằng isNaN ("Infinity") === false, có lẽ cũng không phải là những gì bạn muốn (nhưng cũng sẽ không xảy ra trong cuộc sống thực). - Erik Hesselink