在JavaScript中验证十进制数 - IsNumeric()

Mic*_*ren 2318 javascript validation numbers

在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
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 2869

@ 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;
Run Code Online (Sandbox Code Playgroud)

前段时间我不得不实现一个IsNumeric函数,找出一个变量是否包含一个数值,不管它的类型如何,它可能是一个String包含数值(我还要考虑指数表示法等),一个Number对象,几乎任何东西都可以传递给那个函数,我不能做任何类型的假设,照顾类型强制(例如,+true == 1;true不应该被认为是"numeric").

我认为值得分享这套针对众多功能实现的+30单元测试,并且还共享通过我所有测试的那个:

function isNumeric(n) {
    return !isNaN(parseFloat(n)) && isFinite(n);
}
Run Code Online (Sandbox Code Playgroud)

由于强制转换为数字,PS isNaN&isFinite具有令人困惑的行为.在ES6中,Number.isNaNNumber.isFinite将解决这些问题.使用它们时请记住这一点.


更新: 这是jQuery现在如何做到的(2.2稳定):

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

更新: Angular 4.3:

export function isNumeric(value: any): boolean {
    return !isNaN(value - parseFloat(value));
}
Run Code Online (Sandbox Code Playgroud)

  • 顺便说一句,单元测试现在被[jQuery项目]使用(https://github.com/jquery/jquery/commit/83c08ffa1ffa778e41d728ed7fa49044dd7135f9) (39认同)
  • 这与我们使用十进制逗号的其他语言环境失败,但添加`n = n.replace(/,/,".");' 在返回修复之前. (25认同)
  • jQuery现在也在[使用](https://github.com/jquery/jquery/commit/795583d2936a48c6f0048e28f74c5fc71e3a60b0)这个实现. (7认同)
  • @RobG,这种行为是故意的,`2e308> Number.MAX_VALUE`,因为`2e308 == Infinity`.如果您想要一个对正负无穷大值也返回"true"的函数,请检查函数*否.[测试套件]中的2*(http://dl.dropbox.com/u/35146/js/tests/isNumber.html).干杯. (5认同)
  • 这里的解决方案是使用JQuery.他们现在有更好的实现:https://github.com/jquery/jquery/blob/master/src/core.js#L230 (4认同)
  • 负十六进制字符串文字似乎失败了. (3认同)
  • @ vol7ron:我认为并不重要.我只是让其他人知道这个事实,因为测试需要将正十六进制字符串文字验证为数字(另外,我需要一个函数来验证负字符串十六进制数字作为数字).(是的,我确实理解,负的十六进制字符串文字也不会被香草JS强制转换为数字.)`"0x44"*1` - >`68`,`" - 0x44"*1` - >`NaN` in普通的JS. (3认同)
  • 使用Number.isNaN和Number.isFinite将导致所有字符串都为false,但将适用于实际的Number值.这正是*我想要的,但不是这个问题的答案. (3认同)
  • isNaN(1/0)返回false ...然后是的,我们需要isFinite来检查它,得到它.凉! (2认同)
  • @slf:`isNaN(1/0)`返回`false`,但我返回其否定的结果.如果我们按照你的建议删除`isFinite`调用,正负无穷大将是"有效值"(你可能想要或不想要这种行为),而且带有尾随字符的数字字符串将错误地传递,例如`"7.2acdgs"` ...检查功能*否.[测试套件]中的4*(http://dl.dropbox.com/u/35146/js/tests/isNumber.html)... (2认同)
  • @Wk_of_Angmar你认为十六进制是数字吗? (2认同)
  • isNumeric([1]) 应该返回 false,但是 `!isNaN(parseFloat(n)) && isFinite(n);` 它给出 `true`。恕我直言,isNumeric 不应该隐式解析字符串,而应该需要一个数字。可选的解析参数应该通过尝试解析字符串来放松这一点。 (2认同)

Joe*_*orn 331

Arrrgh!不要听正则表达式的答案.RegEx对此很苛刻,我不只是说性能.用你的正则表达式来制作微妙的,不可能发现错误是如此容易.

如果你不能使用isNaN(),这应该更好:

function IsNumeric(input)
{
    return (input - 0) == input && (''+input).trim().length > 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是它的工作原理:

(input - 0)表达式强制JavaScript对您的输入值进行类型强制; 必须首先将其解释为减法运算的数字.如果转换为数字失败,则表达式将导致NaN.然后将此数字结果与您传入的原始值进行比较.由于左侧现在是数字,因此再次使用类型强制.既然来自双方的输入都是从相同的原始值强制转换为相同的类型,那么您会认为它们应该始终相同(始终为真).但是,有一个特殊规则说NaN永远不会等于NaN,因此无法转换为数字的值(并且只有不能转换为数字的值)将导致错误.

检查长度是针对涉及空字符串的特殊情况.另请注意,它会降低到您的0x89f测试,但这是因为在许多环境中,定义数字文字是一种可行的方法.如果要捕获该特定方案,可以添加其他检查.更好的是,如果这是你不使用的原因,isNaN()那么只需将自己的功能包裹起来isNaN(),也可以进行额外的检查.

总之,如果您想知道某个值是否可以转换为数字,实际上会尝试将其转换为数字.


我回去做了一些研究,为什么空白字符串没有预期的输出,我想我现在得到它:一个空字符串被强制0而不是NaN.在长度检查之前简单地修剪字符串将处理这种情况.

运行单元测试新代码,它只在无限和布尔文字上失败,唯一应该是问题的时候是你生成代码(真的,谁会输入文字并检查它是否是数字?你应该知道),这将是一些奇怪的代码生成.

但是,再一次,使用它的唯一原因是,如果由于某种原因你必须避免使用isNaN().

  • 它也将失败`Number`文字`IsNumeric(5)== false;`检查我发布的单元测试集,这个函数是测试套件上的数字`16`.http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric/1830844#1830844 (29认同)
  • 这在空格字符串上失败,例如`IsNumeric('')`,`IsNumeric('\n\t')`等等都返回`true` (28认同)
  • 我不敢相信在没有使用正则表达式的警告之后没有人指出使用正则表达式(替换)...当然,空格替换比数字解析更简单,但它仍然绝对"icky". (20认同)

Mic*_*ren 66

这种方式似乎运作良好:

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

并测试它:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

我从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
Run Code Online (Sandbox Code Playgroud)


cam*_*ase 52

雅虎 UI使用此:

isNumber: function(o) {
    return typeof o === 'number' && isFinite(o);
}
Run Code Online (Sandbox Code Playgroud)

  • 这更多地是检查变量类型而不是数字的内容.使用`new Number(1)`创建的数字也会失败. (25认同)
  • 正如亚历克斯所说,这实际上并没有回答所提出的问题,因为如果o ="1001",这将失败. (4认同)

小智 49

function IsNumeric(num) {
     return (num >=0 || num < 0);
}
Run Code Online (Sandbox Code Playgroud)

这适用于0x23类型数字.

  • `IsNumeric('')`,`IsNumeric('')`,`IsNumeric(true)`,`IsNumeric(false)`,`IsNumeric(null)`return`true`而不是`false`. (29认同)

Xot*_*750 47

接受的答案没有通过你的测试#7,我想这是因为你改变了主意.所以这是对已接受答案的回应,我遇到了问题.

在某些项目中,我需要验证一些数据并尽可能确定它是一个可以在数学运算中使用的javascript数值.

jQuery和其他一些javascript库已经包含了这样一个函数,通常称为isNumeric.stackoverflow上还有一篇文章已被广泛接受作为答案,与上述库所使用的相同的一般例程.

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}
Run Code Online (Sandbox Code Playgroud)

首先,如果参数是长度为1的数组,则上面的代码将返回true,并且该单个元素是上述逻辑认为是数字的类型.在我看来,如果它是一个数组,那么它不是数字.

为了缓解这个问题,我添加了一个检查来从逻辑中对数组进行折扣

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

当然,您也可以使用Array.isArray,jquery $.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(/^-/, ''));
}
Run Code Online (Sandbox Code Playgroud)

如果你每次调用函数时都担心正则表达式的创建,那么你可以在一个闭包中重写它,就像这样

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

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

然后,我接受了CMSs +30测试用例,在jsfiddle上克隆了测试,添加了我的额外测试用例和我上面提到的解决方案.

它可能无法取代广泛接受/使用过的答案,但如果这更像是您所期望的isNumeric函数的结果,那么希望这会有所帮助.

编辑:正如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(/^-/, ''));
}
Run Code Online (Sandbox Code Playgroud)

测试解决方案

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());
  });
});
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是最具屏蔽的功能; 最后一个.接受的答案可能占所有案例的99.99%,但这一案件可能有100%的a)案件,开销很小. (2认同)

tra*_*vis 33

是的,内置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
Run Code Online (Sandbox Code Playgroud)


bub*_*uro 16

使用该功能isNaN.我相信如果你测试!isNaN(yourstringhere)它适用于任何这些情况.


Kuf*_*Kuf 15

从jQuery 1.7开始,你可以使用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
Run Code Online (Sandbox Code Playgroud)

请注意,与您所说的不同,0x89f是有效数字(hexa)


Aqu*_*tic 12

它可以在没有RegExp的情况下完成

function IsNumeric(data){
    return parseFloat(data)==data;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我们使用==,即使对于以字符串形式呈现的数字,它也会返回true.因此,对于"==","42"将被计为有效数字,并且在===的情况下将被视为无效 (5认同)

小智 7

return (input - 0) == input && input.length > 0;
Run Code Online (Sandbox Code Playgroud)

不适合我.当我提出警告并进行测试时,input.lengthundefined.我认为没有属性来检查整数长度.所以我做的是

var temp = '' + input;
return (input - 0) == input && temp.length > 0;
Run Code Online (Sandbox Code Playgroud)

它工作正常.


Sea*_*ean 7

我意识到原始问题没有提到jQuery,但如果你使用jQuery,你可以这样做:

$.isNumeric(val)
Run Code Online (Sandbox Code Playgroud)

简单.

https://api.jquery.com/jQuery.isNumeric/ (从jQuery 1.7开始)


pot*_*eat 6

需要添加几个测试:

IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false
Run Code Online (Sandbox Code Playgroud)

我想出了这个:

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

该解决方案涵盖:

  • 开头有一个可选的负号
  • 单个零,或不以 0 开头的一个或多个数字,或者只要后面有一个句点就什么都没有
  • 句点后跟 1 个或多个数字


小智 6

如果我没有弄错的话,这应该匹配任何有效的JavaScript数值,不包括常量(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
Run Code Online (Sandbox Code Playgroud)

有效数字包括:

 - 0
 - 00
 - 01
 - 10
 - 0e1
 - 0e01
 - .0
 - 0.
 - .0e1
 - 0.e1
 - 0.e00
 - 0xf
 - 0Xf
Run Code Online (Sandbox Code Playgroud)

数字无效

 - 00e1
 - 01e1
 - 00.0
 - 00x0
 - .
 - .e0
Run Code Online (Sandbox Code Playgroud)


hob*_*obs 6

我对@ CMS的答案唯一的问题是排除了NaNInfinity,这在许多情况下都是有用的数字.检查NaNs的一种方法是检查不相等的数值,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
Run Code Online (Sandbox Code Playgroud)

我的isComparableNumber非常接近另一个优雅的答案,但处理数字的十六进制和其他字符串表示.


Mar*_*ius 5

我想添加以下内容:

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));
}
Run Code Online (Sandbox Code Playgroud)


小智 5

对我来说,这是最好的方式:

isNumber : function(v){
   return typeof v === 'number' && isFinite(v);
}
Run Code Online (Sandbox Code Playgroud)


adi*_*ius 5

要检查变量是否包含有效数字,而不仅仅是看起来像数字的字符串, 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
Run Code Online (Sandbox Code Playgroud)


Joh*_*kic 5

我认为parseFloat函数可以在这里完成所有工作。以下功能通过了此页面上的所有测试,包括isNumeric(Infinity) == true

function isNumeric(n) {

    return parseFloat(n) == n;
}
Run Code Online (Sandbox Code Playgroud)