我想要最简单的故障安全测试来检查JavaScript中的字符串是否为正整数。
isNaN(str)对于各种非整数值返回true,并且parseInt(str)为浮点字符串返回整数,例如“ 2.5”。而且我也不想使用某些jQuery插件。
isNaN(str)
parseInt(str)
为您提供两个答案:
基于解析
正则表达式
请注意,在两种情况下,我都将“正整数”解释为包括0,即使0它不是正数。如果您不愿意,我会提供注释0。
0
如果希望它是在合理值范围内的归一化十进制整数字符串,则可以执行以下操作:
function isNormalInteger(str) { var n = Math.floor(Number(str)); return n !== Infinity && String(n) === str && n >= 0; }
或者,如果您想允许空格和前导零:
function isNormalInteger(str) { str = str.trim(); if (!str) { return false; } str = str.replace(/^0+/, "") || "0"; var n = Math.floor(Number(str)); return n !== Infinity && String(n) === str && n >= 0; }
实时测试平台(不处理前导零或空白):
function isNormalInteger(str) { var n = Math.floor(Number(str)); return n !== Infinity && String(n) === str && n >= 0; } function gid(id) { return document.getElementById(id); } function test(str, expect) { var result = isNormalInteger(str); console.log( str + ": " + (result ? "Yes" : "No") + (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***") ); } gid("btn").addEventListener( "click", function() { test(gid("text").value); }, false ); test("1", true); test("1.23", false); test("1234567890123", true); test("1234567890123.1", false); test("0123", false); // false because we don't handle leading 0s test(" 123 ", false); // false because we don't handle whitespace <label> String: <input id="text" type="text" value=""> <label> <input id="btn" type="button" value="Check">
实时测试平台( 可 处理前导零和空白):
function isNormalInteger(str) { str = str.trim(); if (!str) { return false; } str = str.replace(/^0+/, "") || "0"; var n = Math.floor(Number(str)); return String(n) === str && n >= 0; } function gid(id) { return document.getElementById(id); } function test(str, expect) { var result = isNormalInteger(str); console.log( str + ": " + (result ? "Yes" : "No") + (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***") ); } gid("btn").addEventListener( "click", function() { test(gid("text").value); }, false ); test("1", true); test("1.23", false); test("1234567890123", true); test("1234567890123.1", false); test("0123", true); test(" 123 ", true); <label> String: <input id="text" type="text" value=""> <label> <input id="btn" type="button" value="Check">
如果您要禁止0,请更改>= 0为> 0。(或者,在允许前导零的版本中,删除|| "0"该replace行。)
>= 0
> 0
|| "0"
replace
工作原理:
在允许空格和前导零的版本中:
str = str.trim();
if (!str)
str = str.replace(/^0+/, "") || "0";
Number(str)
str
NaN
Math.floor:截断数字(切掉任何小数部分)。
Math.floor
String(...):将结果转换回普通的十进制字符串。对于很大的数字,将采用科学计数法,这可能会破坏这种方法。(我不太清楚拆分的位置,规范中有详细信息,但对于整数,我认为这是您已超过21位数字的原因[到那时,该数字变得非常不精确,如IEEE-754双精度数字的精度大约只有15位数字。)
String(...)
... === str:将其与原始字符串进行比较。
... === str
n >= 0:检查结果是否正确。
n >= 0
请注意,这对于输入"+1",科学表示法的任何输入(在该String(...)阶段没有变回相同的科学表示法)以及JavaScript使用的数字类型的任何值(IEEE-754双精度二进制浮点数)均失败不能准确表示哪个解析比给定的解析更接近不同的值(例如,包含超过9,007,199,254,740,992的许多整数;例如,1234567890123456789将失败)。前者是一个容易解决的问题,后两者则不是很多。
"+1"
1234567890123456789
另一种方法是,如果您的目标是允许(说)一个可选的,+后面跟一个0或十进制格式的字符串,则通过正则表达式测试字符串的字符:
+
function isNormalInteger(str) { return /^\+?(0|[1-9]\d*)$/.test(str); }
现场测试台:
function isNormalInteger(str) { return /^\+?(0|[1-9]\d*)$/.test(str); } function gid(id) { return document.getElementById(id); } function test(str, expect) { var result = isNormalInteger(str); console.log( str + ": " + (result ? "Yes" : "No") + (expect === undefined ? "" : !!expect === !!result ? " <= OK" : " <= ERROR ***") ); } gid("btn").addEventListener( "click", function() { test(gid("text").value); }, false ); test("1", true); test("1.23", false); test("1234567890123", true); test("1234567890123.1", false); test("0123", false); // false because we don't handle leading 0s test(" 123 ", false); // false because we don't handle whitespace <label> String: <input id="text" type="text" value=""> <label> <input id="btn" type="button" value="Check">
^:匹配字符串的开头
^
\+?:允许一个可选的+(如果您不想删除此选项)
\+?
(?:...|...):允许以下两个选项之一(不创建捕获组):
(?:...|...)
(0|...):允许0自己…
(0|...)
(...|[1-9]\d*):…或以非零开头的数字0,后接任意十进制数字。
(...|[1-9]\d*)
$:匹配字符串的结尾。
$
如果要禁止0(因为它不是正数),则正则表达式将变为公正/^\+?[1-9]\d*$/(例如,我们可能会丢失需要允许的替代0)。
/^\+?[1-9]\d*$/
如果要允许前导零(0123、00524),则只需将替换替换(?:0|[1-9]\d*)为\d+
(?:0|[1-9]\d*)
\d+
function isNormalInteger(str) { return /^\+?\d+$/.test(str); }
如果你想允许空格,加\s*刚过^与\s*之前$。
\s*
请注意何时将其转换为数字:在现代引擎上,使用+str或Number(str)执行它可能会很好,但是较旧的引擎可能会以非标准(但以前允许)的方式扩展它们,即前导零表示 八进制 (以8为底),例如“ 010” =>8。验证数字后,可以放心使用parseInt(str, 10)以确保将其解析为十进制(以10为底)。parseInt会忽略字符串末尾的垃圾,但是我们确保正则表达式没有任何垃圾。
+str
parseInt(str, 10)
parseInt