validation一个string是一个正整数
我想要最简单的故障安全testing来检查JavaScript中的string是一个正整数。
isNaN(str)
对各种非整数值返回true, parseInt(str)
返回浮点数字的整数,如“2.5”。 而且我也不想使用一些jQuery插件。
给你两个答案:
-
基于parsing
-
正则expression式
请注意,在这两种情况下,我已经解释“正整数”包括0
,即使0
不是正数。 如果你想禁止0
我会包含注释。
基于parsing
如果你希望它是一个合理范围的值的标准化十进制整数string,你可以这样做:
function isNormalInteger(str) { var n = Math.floor(Number(str)); return String(n) === str && n >= 0; }
现场试验台:
function isNormalInteger(str) { var n = Math.floor(Number(str)); return String(n) === str && n >= 0; } function gid(id) { return document.getElementById(id); } function test(str, expect) { console.log(str + ": " + (isNormalInteger(str) ? "Yes" : "No")); } gid("btn").addEventListener( "click", function() { test(gid("text").value); }, false ); test("1"); test("1.23"); test("1234567890123"); test("1234567890123.1");
<label> String: <input id="text" type="text" value=""> <label> <input id="btn" type="button" value="Check">
解决scheme1
如果我们认为一个JavaScript整数是最大值4294967295
(即Math.pow(2,32)-1
),那么下面的短的解决scheme将完美的工作:
function isPositiveInteger(n) { return n >>> 0 === parseFloat(n); }
描述:
- 零填充右移运算符做三件重要的事情:
- 截断小数部分
-
123.45 >>> 0 === 123
-
- 做负数的转变
-
-1 >>> 0 === 4294967295
-
-
MAX_INT
范围内的“作品”-
1e10 >>> 0 === 1410065408
-
1e7 >>> 0 === 10000000
-
- 截断小数部分
-
parseFloat
不会正确parsingstring数字(为非数字string设置NaN
)
testing:
"0" : true "23" : true "-10" : false "10.30" : false "-40.1" : false "string" : false "1234567890" : true "129000098131766699.1" : false "-1e7" : false "1e7" : true "1e10" : false "1edf" : false " " : false "" : false
DEMO: http : //jsfiddle.net/5UCy4/37/
解决scheme2
另一种方法是有效的所有数字值是有效的Number.MAX_VALUE
,即约1.7976931348623157e+308
:
function isPositiveInteger(n) { return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n); }
描述:
-
!isNaN(parseFloat(n))
用于过滤纯string值,例如""
," "
,"string"
; -
0 <= ~~n
过滤负数和大的非整数值,例如"-40.1"
,"129000098131766699"
; -
(!isNaN(parseFloat(n)) && 0 <= ~~n)
如果value是数字和正 数 ,则返回true
; -
0 === n % (...)
检查值是否为非浮点数 – 此处(...)
(见3)在false
为0
,在为true
为1
。
testing:
"0" : true "23" : true "-10" : false "10.30" : false "-40.1" : false "string" : false "1234567890" : true "129000098131766699.1" : false "-1e10" : false "1e10" : true "1edf" : false " " : false "" : false
DEMO: http : //jsfiddle.net/5UCy4/14/
以前的版本:
function isPositiveInteger(n) { return n == "0" || ((n | 0) > 0 && n % 1 == 0); }
演示: http : //jsfiddle.net/5UCy4/2/
看起来像一个正则expression式是要走的路:
var isInt = /^\+?\d+$/.test('the string');
这几乎是一个重复的问题:
validationJavaScript中的十进制数 – IsNumeric()
答案是:
function isNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n); }
所以,一个正整数将是:
function isPositiveInteger(n) { var floatN = parseFloat(n); return !isNaN(floatN) && isFinite(n) && floatN > 0 && floatN % 1 == 0; }
return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);
如果你给一个像“0001”这样的string,将不起作用
我的函数检查数字是否为+ ve,也可能有十进制值。
function validateNumeric(numValue){ var value = parseFloat(numValue); if (!numValue.toString().match(/^[-]?\d*\.?\d*$/)) return false; else if (numValue < 0) { return false; } return true; }
(~~a == a)
其中a
是string。
只要在上面的VisioN的答案上,如果你使用jQueryvalidation插件,你可以使用这个:
$(document).ready(function() { $.validator.addMethod('integer', function(value, element, param) { return (value >>> 0 === parseFloat(value) && value > 0); }, 'Please enter a non zero integer value!'); }
那么你可以在你的普通规则集中使用或者dynamic地添加它:
$("#positiveIntegerField").rules("add", {required:true, integer:true});
如果您使用的是HTML5表单,则可以使用属性min="0"
作为表单元素<input type="number" />
。 这由所有主stream浏览器支持。 它不涉及JavaScript这样简单的任务,而是集成在新的html标准中。 它logging在https://www.w3schools.com/tags/att_input_min.asp