在JavaScript中验证十进制数的最干净,最有效的方法是什么?
奖励积分:
明晰.解决方案应该干净简单.
跨平台.
测试用例:
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
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;
前段时间我不得不实现一个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稳定):
isNumeric: function(obj) { var realStringObj = obj && obj.toString(); return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0; }
更新: Angular 4.3:
export function isNumeric(value: any): boolean { return !isNaN(value - parseFloat(value)); }
顺便说一句,单元测试现在被[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认同)
Joel Coehoor.. 331
Arrrgh!不要听正则表达式的答案.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().
@ 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稳定):
isNumeric: function(obj) { var realStringObj = obj && obj.toString(); return !jQuery.isArray(obj) && (realStringObj - parseFloat(realStringObj) + 1) >= 0; }
更新: Angular 4.3:
export function isNumeric(value: any): boolean { return !isNaN(value - parseFloat(value)); }
Arrrgh!不要听正则表达式的答案.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
雅虎 UI使用此:
isNumber: function(o) { return typeof o === 'number' && isFinite(o); }
function IsNumeric(num) { return (num >=0 || num < 0); }
这适用于0x23类型数字.
接受的答案没有通过你的测试#7,我想这是因为你改变了主意.所以这是对已接受答案的回应,我遇到了问题.
在某些项目中,我需要验证一些数据并尽可能确定它是一个可以在数学运算中使用的javascript数值.
jQuery和其他一些javascript库已经包含了这样一个函数,通常称为isNumeric
.stackoverflow上还有一篇文章已被广泛接受作为答案,与上述库所使用的相同的一般例程.
function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); }
首先,如果参数是长度为1的数组,则上面的代码将返回true,并且该单个元素是上述逻辑认为是数字的类型.在我看来,如果它是一个数组,那么它不是数字.
为了缓解这个问题,我添加了一个检查来从逻辑中对数组进行折扣
function isNumber(n) { return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n); }
当然,您也可以使用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(/^-/, '')); }
如果你每次调用函数时都担心正则表达式的创建,那么你可以在一个闭包中重写它,就像这样
var isNumber = (function () { var rx = /^-/; return function (n) { return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, '')); }; }());
然后,我接受了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(/^-/, '')); }
测试解决方案
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('');
}
}
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());
});
});
isNumber Test Cases
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11
-
Integer Literals (0, 10, 10)
- Negative integer string
- Zero string
- Positive integer string
- Negative integer number
- Zero integer number
- Positive integer number
- Octal integer literal string
- Octal integer literal
- Hexadecimal integer literal string
- Hexadecimal integer literal
-
Foating-Point Literals (0, 6, 6)
- Negative floating point string
- Positive floating point string
- Negative floating point number
- Positive floating point number
- Exponential notation
- Exponential notation string
-
Non-Numeric values (0, 18, 18)
- Empty string: false
- Whitespace characters string: false
- Tab characters string: false
- Alphanumeric character string: false
- Non-numeric character string: false
- Boolean true literal: false
- Boolean false literal: false
- Number with preceding non-numeric characters: false
- Number with trailling non-numeric characters: false
- Undefined value: false
- Null value: false
- NaN value: false
- Infinity primitive: false
- Positive Infinity: false
- Negative Infinity: false
- Date object: false
- Empty object: false
- Instance of a function: false
This page contains tests for a set of isNumber functions. To see them, take a look at the source.
Tests completed in 0 milliseconds.
0 tests of 0 failed.
是的,内置isNaN(object)
将比任何正则表达式解析快得多,因为它是内置和编译的,而不是动态解释.
虽然结果与您正在寻找的结果略有不同(尝试一下):
// IS NUMERIC document.write(!isNaN('-1') + "
"); // true document.write(!isNaN('-1.5') + "
"); // true document.write(!isNaN('0') + "
"); // true document.write(!isNaN('0.42') + "
"); // true document.write(!isNaN('.42') + "
"); // true document.write(!isNaN('99,999') + "
"); // false document.write(!isNaN('0x89f') + "
"); // true document.write(!isNaN('#abcdef') + "
"); // false document.write(!isNaN('1.2.3') + "
"); // false document.write(!isNaN('') + "
"); // true document.write(!isNaN('blah') + "
"); // false
使用该功能isNaN
.我相信如果你测试!isNaN(yourstringhere)
它适用于任何这些情况.
从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
请注意,与您所说的不同,0x89f
是有效数字(hexa)
它可以在没有RegExp的情况下完成
function IsNumeric(data){ return parseFloat(data)==data; }
return (input - 0) == input && input.length > 0;
不适合我.当我提出警告并进行测试时,input.length
是undefined
.我认为没有属性来检查整数长度.所以我做的是
var temp = '' + input; return (input - 0) == input && temp.length > 0;
它工作正常.
我意识到原始问题没有提到jQuery,但如果你使用jQuery,你可以这样做:
$.isNumeric(val)
简单.
https://api.jquery.com/jQuery.isNumeric/ (从jQuery 1.7开始)
如果我没有弄错的话,这应该匹配任何有效的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
有效数字包括:
- 0 - 00 - 01 - 10 - 0e1 - 0e01 - .0 - 0. - .0e1 - 0.e1 - 0.e00 - 0xf - 0Xf
数字无效
- 00e1 - 01e1 - 00.0 - 00x0 - . - .e0
我对@ CMS的答案唯一的问题是排除了NaN
Infinity,这在许多情况下都是有用的数字.检查NaN
s的一种方法是检查不相等的数值,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非常接近另一个优雅的答案,但处理数字的十六进制和其他字符串表示.
我想添加以下内容:
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)); }
对我来说,这是最好的方式:
isNumber : function(v){ return typeof v === 'number' && isFinite(v); }
我认为parseFloat函数可以在这里完成所有工作。以下功能通过了此页面上的所有测试,包括isNumeric(Infinity) == true
:
function isNumeric(n) { return parseFloat(n) == n; }