提问人: 提问时间:8/20/2008 最后编辑:12 revs, 9 users 30%Michael Haren 更新时间:7/7/2023 访问量:1570162
在 JavaScript 中验证十进制数 - IsNumeric()
Validate decimal numbers in JavaScript - IsNumeric()
问:
在 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
答:
这种方式似乎效果很好:
function IsNumeric(input){
var RE = /^-{0,1}\d*\.{0,1}\d+$/;
return (RE.test(input));
}
在一行中:
const IsNumeric = (num) => /^-{0,1}\d*\.{0,1}\d+$/.test(num);
并测试它:
const IsNumeric = (num) => /^-{0,1}\d*\.{0,1}\d+$/.test(num);
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;
}
console.log(TestIsNumeric());
.as-console-wrapper { max-height: 100% !important; top: 0; }
我从 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
要添加的几个测试:
IsNumeric('01.05') => false
IsNumeric('1.') => false
IsNumeric('.') => false
我想出了这个:
function IsNumeric(input) {
return /^-?(0|[1-9]\d*|(?=\.))(\.\d+)?$/.test(input);
}
该解决方案包括:
- 开头的可选负号
- 单个零,或一个或多个不以 0 开头的数字,或者只要后面有一个句点,就没有
- 后跟 1 个或多个数字的句点
我想补充以下内容:
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));
}
使用函数 .我相信,如果您对其进行测试,它适用于任何这些情况。isNaN
!isNaN(yourstringhere)
是的,内置的 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
它可以在没有 RegExp 的情况下完成,因为
function IsNumeric(data){
return parseFloat(data)==data;
}
啊!不要听正则表达式的答案。正则表达式对此很讨厌,我说的不仅仅是性能。很容易做出微妙的、不可能用正则表达式发现错误。
如果你不能使用——记住:我说过,“IF”——这应该会更好:isNaN()
function IsNumeric(input)
{
return (input - 0) == input && (''+input).trim().length > 0;
}
其工作原理如下:
该表达式强制 JavaScript 对输入值进行类型强制;它必须首先被解释为减法运算的数字。如果转换为数字失败,则表达式将导致 (Not a Number)。然后,将此数值结果与您传入的原始值进行比较。由于左侧现在是数字,因此再次使用类型强制。现在,两端的输入被强制为来自同一原始值的相同类型,您会认为它们应该始终相同(始终为真)。但是,有一个特殊的规则说 永远不会等于 ,因此无法转换为数字的值(并且只有无法转换为数字的值)将导致 false。(input - 0)
NaN
NaN
NaN
长度检查适用于涉及空字符串的特殊情况。另请注意,它取决于您的0x89f测试,但这是因为对于 javascript 来说,这是定义数字文字的有效方法。如果你想抓住那个特定的场景,你可以添加一个额外的检查。更好的是,如果这是您不使用的原因,那么只需将您自己的函数包装起来,也可以进行额外的检查。isNaN()
isNaN()
总之,如果你想知道一个值是否可以转换为一个数字,实际上尝试将其转换为一个数字。
我回去做了一些研究,为什么空格字符串没有预期的输出,我想我现在明白了:一个空字符串被强制而不是 .只需在长度检查之前修剪字符串即可处理这种情况。0
NaN
针对新代码运行单元测试,它只会在无穷大和布尔文本上失败,唯一应该有问题的时间是生成代码(真的,谁会输入文本并检查它是否是数字?你应该知道),这将是一些奇怪的代码。
但是,同样,使用它的唯一原因是,如果出于某种原因,您必须避免 isNaN()。
评论
TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
+input
IsNumeric( [1] )
返回。true
Yahoo! UI 使用以下功能:
isNumber: function(o) {
return typeof o === 'number' && isFinite(o);
}
function IsNumeric(num) {
return (num >=0 || num < 0);
}
这也适用于0x23类型编号。
评论
true
@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);
}
P.S. isNaN 和 isFinite 由于强制转换为数字而出现令人困惑的行为。在ES6中,Number.isNaN和Number.isFinite可以解决这些问题。 使用它们时请记住这一点。
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));
}
评论
!isNaN(parseFloat(n)) && isFinite(n);
true
对我来说,这是最好的方法:
isNumber : function(v){
return typeof v === 'number' && isFinite(v);
}
评论
这应该有效。这里提供的一些功能是有缺陷的,也应该比这里的任何其他功能都快。
function isNumeric(n)
{
var n2 = n;
n = parseFloat(n);
return (n!='NaN' && n2==n);
}
解释:
创建一个自身的副本,然后将数字转换为浮点数,然后将自己与原始数字进行比较,如果它仍然是一个数字,(无论是整数还是浮点数),并且与原始数字匹配,这意味着,它确实是一个数字。
它适用于数字字符串和纯数字。不适用于十六进制数。
警告:使用风险自负,不作任何保证。
return (input - 0) == input && input.length > 0;
对我不起作用。当我发出警报并进行测试时,是.我认为没有检查整数长度的属性。所以我所做的是input.length
undefined
var temp = '' + input;
return (input - 0) == input && temp.length > 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(value) {
var bool = isNaN(+value));
bool = bool || (value.indexOf('.') != -1);
bool = bool || (value.indexOf(",") != -1);
return !bool;
};
这样更容易、更快捷!检查所有测试!
如果我没记错的话,这应该与任何有效的 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
我正在使用更简单的解决方案:
function isNumber(num) {
return parseFloat(num).toString() == num
}
评论
从 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
被接受的答案没有通过你的测试#7,我想这是因为你改变了主意。所以这是对公认的答案的回应,我有问题。
在一些项目中,我需要验证一些数据,并尽可能确定它是一个可用于数学运算的 javascript 数值。
jQuery 和其他一些 javascript 库已经包含这样的函数,通常称为 .还有一篇关于 stackoverflow 的帖子被广泛接受为答案,与上述库使用的通用例程相同。isNumeric
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);
}
当然,你也可以使用 、jquery 或 prototype 来代替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
编辑:正如 Bergi 所指出的,还有其他可能的对象可以被视为数字,白名单比黑名单更好。考虑到这一点,我会补充标准。
我希望我的函数只考虑数字或字符串isNumeric
考虑到这一点,最好使用
function isNumber(n) {
return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
测试解决方案
var testHelper = function() {
var testSuite = function() {
test("Integer Literals", function() {
ok(isNumber("-10"), "Negative integer string");
ok(isNumber("0"), "Zero string");
ok(isNumber("5"), "Positive integer string");
ok(isNumber(-16), "Negative integer number");
ok(isNumber(0), "Zero integer number");
ok(isNumber(32), "Positive integer number");
ok(isNumber("040"), "Octal integer literal string");
ok(isNumber(0144), "Octal integer literal");
ok(isNumber("-040"), "Negative Octal integer literal string");
ok(isNumber(-0144), "Negative Octal integer literal");
ok(isNumber("0xFF"), "Hexadecimal integer literal string");
ok(isNumber(0xFFF), "Hexadecimal integer literal");
ok(isNumber("-0xFF"), "Negative Hexadecimal integer literal string");
ok(isNumber(-0xFFF), "Negative Hexadecimal integer literal");
});
test("Foating-Point Literals", function() {
ok(isNumber("-1.6"), "Negative floating point string");
ok(isNumber("4.536"), "Positive floating point string");
ok(isNumber(-2.6), "Negative floating point number");
ok(isNumber(3.1415), "Positive floating point number");
ok(isNumber(8e5), "Exponential notation");
ok(isNumber("123e-2"), "Exponential notation string");
});
test("Non-Numeric values", function() {
equals(isNumber(""), false, "Empty string");
equals(isNumber(" "), false, "Whitespace characters string");
equals(isNumber("\t\t"), false, "Tab characters string");
equals(isNumber("abcdefghijklm1234567890"), false, "Alphanumeric character string");
equals(isNumber("xabcdefx"), false, "Non-numeric character string");
equals(isNumber(true), false, "Boolean true literal");
equals(isNumber(false), false, "Boolean false literal");
equals(isNumber("bcfed5.2"), false, "Number with preceding non-numeric characters");
equals(isNumber("7.2acdgs"), false, "Number with trailling non-numeric characters");
equals(isNumber(undefined), false, "Undefined value");
equals(isNumber(null), false, "Null value");
equals(isNumber(NaN), false, "NaN value");
equals(isNumber(Infinity), false, "Infinity primitive");
equals(isNumber(Number.POSITIVE_INFINITY), false, "Positive Infinity");
equals(isNumber(Number.NEGATIVE_INFINITY), false, "Negative Infinity");
equals(isNumber(new Date(2009, 1, 1)), false, "Date object");
equals(isNumber(new Object()), false, "Empty object");
equals(isNumber(function() {}), false, "Instance of a function");
equals(isNumber([]), false, "Empty Array");
equals(isNumber(["-10"]), false, "Array Negative integer string");
equals(isNumber(["0"]), false, "Array Zero string");
equals(isNumber(["5"]), false, "Array Positive integer string");
equals(isNumber([-16]), false, "Array Negative integer number");
equals(isNumber([0]), false, "Array Zero integer number");
equals(isNumber([32]), false, "Array Positive integer number");
equals(isNumber(["040"]), false, "Array Octal integer literal string");
equals(isNumber([0144]), false, "Array Octal integer literal");
equals(isNumber(["-040"]), false, "Array Negative Octal integer literal string");
equals(isNumber([-0144]), false, "Array Negative Octal integer literal");
equals(isNumber(["0xFF"]), false, "Array Hexadecimal integer literal string");
equals(isNumber([0xFFF]), false, "Array Hexadecimal integer literal");
equals(isNumber(["-0xFF"]), false, "Array Negative Hexadecimal integer literal string");
equals(isNumber([-0xFFF]), false, "Array Negative Hexadecimal integer literal");
equals(isNumber([1, 2]), false, "Array with more than 1 Positive interger number");
equals(isNumber([-1, -2]), false, "Array with more than 1 Negative interger number");
});
}
var functionsToTest = [
function(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
},
function(n) {
return !isNaN(n) && !isNaN(parseFloat(n));
},
function(n) {
return !isNaN((n));
},
function(n) {
return !isNaN(parseFloat(n));
},
function(n) {
return typeof(n) != "boolean" && !isNaN(n);
},
function(n) {
return parseFloat(n) === Number(n);
},
function(n) {
return parseInt(n) === Number(n);
},
function(n) {
return !isNaN(Number(String(n)));
},
function(n) {
return !isNaN(+('' + n));
},
function(n) {
return (+n) == n;
},
function(n) {
return n && /^-?\d+(\.\d+)?$/.test(n + '');
},
function(n) {
return isFinite(Number(String(n)));
},
function(n) {
return isFinite(String(n));
},
function(n) {
return !isNaN(n) && !isNaN(parseFloat(n)) && isFinite(n);
},
function(n) {
return parseFloat(n) == n;
},
function(n) {
return (n - 0) == n && n.length > 0;
},
function(n) {
return typeof n === 'number' && isFinite(n);
},
function(n) {
return !Array.isArray(n) && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
];
// Examines the functionsToTest array, extracts the return statement of each function
// and fills the toTest select element.
var fillToTestSelect = function() {
for (var i = 0; i < functionsToTest.length; i++) {
var f = functionsToTest[i].toString();
var option = /[\s\S]*return ([\s\S]*);/.exec(f)[1];
$("#toTest").append('<option value="' + i + '">' + (i + 1) + '. ' + option + '</option>');
}
}
var performTest = function(functionNumber) {
reset(); // Reset previous test
$("#tests").html(""); //Clean test results
isNumber = functionsToTest[functionNumber]; // Override the isNumber global function with the one to test
testSuite(); // Run the test
// Get test results
var totalFail = 0;
var totalPass = 0;
$("b.fail").each(function() {
totalFail += Number($(this).html());
});
$("b.pass").each(function() {
totalPass += Number($(this).html());
});
$("#testresult").html(totalFail + " of " + (totalFail + totalPass) + " test failed.");
$("#banner").attr("class", "").addClass(totalFail > 0 ? "fail" : "pass");
}
return {
performTest: performTest,
fillToTestSelect: fillToTestSelect,
testSuite: testSuite
};
}();
$(document).ready(function() {
testHelper.fillToTestSelect();
testHelper.performTest(0);
$("#toTest").change(function() {
testHelper.performTest($(this).children(":selected").val());
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script src="https://rawgit.com/Xotic750/testrunner-old/master/testrunner.js" type="text/javascript"></script>
<link href="https://rawgit.com/Xotic750/testrunner-old/master/testrunner.css" rel="stylesheet" type="text/css">
<h1>isNumber Test Cases</h1>
<h2 id="banner" class="pass"></h2>
<h2 id="userAgent">Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11</h2>
<div id="currentFunction"></div>
<div id="selectFunction">
<label for="toTest" style="font-weight:bold; font-size:Large;">Select function to test:</label>
<select id="toTest" name="toTest">
</select>
</div>
<div id="testCode"></div>
<ol id="tests">
<li class="pass">
<strong>Integer Literals <b style="color:black;">(0, 10, 10)</b></strong>
<ol style="display: none;">
<li class="pass">Negative integer string</li>
<li class="pass">Zero string</li>
<li class="pass">Positive integer string</li>
<li class="pass">Negative integer number</li>
<li class="pass">Zero integer number</li>
<li class="pass">Positive integer number</li>
<li class="pass">Octal integer literal string</li>
<li class="pass">Octal integer literal</li>
<li class="pass">Hexadecimal integer literal string</li>
<li class="pass">Hexadecimal integer literal</li>
</ol>
</li>
<li class="pass">
<strong>Foating-Point Literals <b style="color:black;">(0, 6, 6)</b></strong>
<ol style="display: none;">
<li class="pass">Negative floating point string</li>
<li class="pass">Positive floating point string</li>
<li class="pass">Negative floating point number</li>
<li class="pass">Positive floating point number</li>
<li class="pass">Exponential notation</li>
<li class="pass">Exponential notation string</li>
</ol>
</li>
<li class="pass">
<strong>Non-Numeric values <b style="color:black;">(0, 18, 18)</b></strong>
<ol style="display: none;">
<li class="pass">Empty string: false</li>
<li class="pass">Whitespace characters string: false</li>
<li class="pass">Tab characters string: false</li>
<li class="pass">Alphanumeric character string: false</li>
<li class="pass">Non-numeric character string: false</li>
<li class="pass">Boolean true literal: false</li>
<li class="pass">Boolean false literal: false</li>
<li class="pass">Number with preceding non-numeric characters: false</li>
<li class="pass">Number with trailling non-numeric characters: false</li>
<li class="pass">Undefined value: false</li>
<li class="pass">Null value: false</li>
<li class="pass">NaN value: false</li>
<li class="pass">Infinity primitive: false</li>
<li class="pass">Positive Infinity: false</li>
<li class="pass">Negative Infinity: false</li>
<li class="pass">Date object: false</li>
<li class="pass">Empty object: false</li>
<li class="pass">Instance of a function: false</li>
</ol>
</li>
</ol>
<div id="main">
This page contains tests for a set of isNumber functions. To see them, take a look at the source.
</div>
<div>
<p class="result">Tests completed in 0 milliseconds.
<br>0 tests of 0 failed.</p>
</div>
knockoutJs 内置库验证函数
通过扩展它,该字段得到验证
1) 数量
self.number = ko.observable(numberValue)
.extend({ number: true});
测试用例
numberValue = '0.0' --> true
numberValue = '0' --> true
numberValue = '25' --> true
numberValue = '-1' --> true
numberValue = '-3.5' --> true
numberValue = '11.112' --> true
numberValue = '0x89f' --> false
numberValue = '' --> false
numberValue = 'sfsd' --> false
numberValue = 'dg##$' --> false
2) 数字
self.number = ko.observable(numberValue)
.extend({ digit: true});
测试用例
numberValue = '0' --> true
numberValue = '25' --> true
numberValue = '0.0' --> false
numberValue = '-1' --> false
numberValue = '-3.5' --> false
numberValue = '11.112' --> false
numberValue = '0x89f' --> false
numberValue = '' --> false
numberValue = 'sfsd' --> false
numberValue = 'dg##$' --> false
3) 最小值和最大值
self.number = ko.observable(numberValue)
.extend({ min: 5}).extend({ 最大: 10});
此字段仅接受介于 5 和 10 之间的值
测试用例
numberValue = '5' --> true
numberValue = '6' --> true
numberValue = '6.5' --> true
numberValue = '9' --> true
numberValue = '11' --> false
numberValue = '0' --> false
numberValue = '' --> false
这是一个小小的改进版本(可能是最快的方法),我用它来代替确切的jQuery的变体,我真的不知道他们为什么不使用这个:
function isNumeric(val) {
return !isNaN(+val) && isFinite(val);
}
jQuery版本的缺点是,如果你传递一个带有前导数字和尾随字母的字符串,比如 将提取数字分数并返回 123,但是,第二个守卫无论如何都会失败。
使用一元算子,它将在第一个守卫上死亡,因为 + 为这种杂交种投掷 NaN :)
有点性能,但我认为是一个坚实的语义增益。"123abc"
parseFloat | parseInt
isFinite
+
评论
我对@CMS的答案的唯一问题是排除和无穷大,这对许多情况都是有用的数字。检查 的一种方法是检查不等于自身的数值 !所以你真的有 3 个测试你想处理......NaN
NaN
NaN != NaN
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 非常接近另一个优雅的答案,但处理十六进制和其他字符串表示形式的数字。
我意识到最初的问题没有提到jQuery,但是如果您确实使用jQuery,则可以执行以下操作:
$.isNumeric(val)
简单。
https://api.jquery.com/jQuery.isNumeric/(从 jQuery 1.7 开始)
我意识到这个问题已经回答了很多次,但以下是一个不错的候选者,在某些情况下可能很有用。
应该注意的是,它假设“.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.
没有一个答案返回空字符串,这是一个修复方法......false
function is_numeric(n)
{
return (n != '' && !isNaN(parseFloat(n)) && isFinite(n));
}
如果您需要验证一组特殊的小数 y 您可以使用以下简单的 JavaScript:
http://codesheet.org/codesheet/x1kI7hAD
<input type="text" name="date" value="" pattern="[0-9]){1,2}(\.){1}([0-9]){2}" maxlength="6" placeholder="od npr.: 16.06" onchange="date(this);" />
The Javascript:
function date(inputField) {
var isValid = /^([0-9]){1,2}(\.){1}([0-9]){2}$/.test(inputField.value);
if (isValid) {
inputField.style.backgroundColor = '#bfa';
} else {
inputField.style.backgroundColor = '#fba';
}
return isValid;
}
检查变量是否包含有效数字,而不包含
只需一个看起来像数字的字符串即可使用。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
我认为parseFloat函数可以在这里完成所有工作。以下函数通过了此页面上的所有测试,包括:isNumeric(Infinity) == true
function isNumeric(n) {
return parseFloat(n) == n;
}
评论
IsNumeric([3]) == true;
IsNumeric([]) == false;
IsNumeric([3, 4]) == false;
function inNumeric(n){
return Number(n).toString() === n;
}
如果 n 是数字,则返回数值并将其变回字符串。但是,如果 n 不是数字,则将返回,因此它不会与原始数字匹配Number(n)
toString()
Number(n)
NaN
n
评论
这是一个非常简单的方法(在 Chrome、Firefox 和 IE 中测试):
function isNumeric(x) {
return parseFloat(x) == x;
}
问题中的测试用例:
console.log('trues');
console.log(isNumeric('-1'));
console.log(isNumeric('-1.5'));
console.log(isNumeric('0'));
console.log(isNumeric('0.42'));
console.log(isNumeric('.42'));
console.log('falses');
console.log(isNumeric('99,999'));
console.log(isNumeric('0x89f'));
console.log(isNumeric('#abcdef'));
console.log(isNumeric('1.2.3'));
console.log(isNumeric(''));
console.log(isNumeric('blah'));
更多测试用例:
console.log('trues');
console.log(isNumeric(0));
console.log(isNumeric(-1));
console.log(isNumeric(-500));
console.log(isNumeric(15000));
console.log(isNumeric(0.35));
console.log(isNumeric(-10.35));
console.log(isNumeric(2.534e25));
console.log(isNumeric('2.534e25'));
console.log(isNumeric('52334'));
console.log(isNumeric('-234'));
console.log(isNumeric(Infinity));
console.log(isNumeric(-Infinity));
console.log(isNumeric('Infinity'));
console.log(isNumeric('-Infinity'));
console.log('falses');
console.log(isNumeric(NaN));
console.log(isNumeric({}));
console.log(isNumeric([]));
console.log(isNumeric(''));
console.log(isNumeric('one'));
console.log(isNumeric(true));
console.log(isNumeric(false));
console.log(isNumeric());
console.log(isNumeric(undefined));
console.log(isNumeric(null));
console.log(isNumeric('-234aa'));
请注意,它将无穷大视为一个数字。
评论
jQuery.isNumeric
jQuery.isNumeric
将失败 OP 的第七个测试用例 ()。但是,我不确定我是否同意这个测试用例。IsNumeric('0x89f') => *false*