我想用最简单的故障安全测试来检查JavaScript中的字符串是否是正整数。
isNaN(str)为所有非整数值返回true, parseInt(str)为浮点字符串返回整数,如“2.5”。我也不想使用一些jQuery插件。
我想用最简单的故障安全测试来检查JavaScript中的字符串是否是正整数。
isNaN(str)为所有非整数值返回true, parseInt(str)为浮点字符串返回整数,如“2.5”。我也不想使用一些jQuery插件。
当前回答
(~~a == a),其中a是字符串。
其他回答
解决方案1
如果我们将JavaScript整数视为最大值4294967295(即Math.pow(2,32)-1),那么以下简短的解决方案将完美地工作:
function isPositiveInteger(n) {
return n >>> 0 === parseFloat(n);
}
描述:
零填充右移操作符有三件重要的事情: 截断小数部分 123.45 >>> 0 === 123 对负数有移位吗 -1 >>> 0 === 4294967295 MAX_INT范围内的"works" 1e10 >>> 0 === 1410065408 1e7 >>> 0 === 10000000 parseFloat正确解析字符串数字(为非数字字符串设置NaN)
测试:
"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
演示:http://jsfiddle.net/5UCy4/37/
解决方案2
另一种方法适用于在Number之前有效的所有数值。MAX_VALUE,即约1.7976931348623157e+308:
function isPositiveInteger(n) {
return 0 === n % (!isNaN(parseFloat(n)) && 0 <= ~~n);
}
描述:
isNaN(parseFloat(n))用于过滤纯字符串值,例如:"", "", "string"; 0 <= ~~n过滤负的和大的非整数值,例如:“-40.1”,“129000098131766699”; (!isNaN(parseFloat(n)) && 0 <= ~~n)如果value为数值且为正数则返回true; 0 === n %(…)检查value是否为非浮点值——这里(…)(见3)在false的情况下被计算为0,在true的情况下被计算为1。
测试:
"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
演示:http://jsfiddle.net/5UCy4/14/
以前的版本:
function isPositiveInteger(n) {
return n == "0" || ((n | 0) > 0 && n % 1 == 0);
}
演示:http://jsfiddle.net/5UCy4/2/
return ((parseInt(str, 10).toString() == str) && str.indexOf('-') === -1);
但是,如果您提供'0001'这样的字符串,则无法工作
大多数情况下,您需要这种类型的数据库使用检查,如检查字符串是否有效的userId。正因为如此,不可能有任何奇怪的符号可以被分割成整数。此外,整数应该在数据库的整数范围内。你只需要普通的整数,比如1 2 3等等。
const isStrNormPosInt = (str: string) => {
return /^([1-9]\d*)$/.test(str) && Number(str) <= 2147483647 // postgres max int
}
如果检查通过了,你可以把它转换成number number (str)
我的标准需要在@VisioN的答案上进行一些额外的检查。
不是负数,包括-0 不是小数部分为零的浮点数——0.0,1.000000 不是指数形式的数字,1e10
我发现这对于验证Express路由器的路由参数很有用。例如/书/:bookId
Code
/**
* Validate that a string is a positive integer
* Excludes float numbers with a zero decimal part, exponential notation and negative 0
* @param n
* @returns {boolean}
*/
function isStrictlyPositiveInteger(n) {
const nString = n.toString(), nInt = parseInt(n), nFloat = parseFloat(n);
// if a negative number (works on -0)
if (nString.charAt(0) === '-') {
return false;
}
// if an exponential like 1e10
if (nString.indexOf('e') > -1) {
return false;
}
// if a float number with a zero decimal part e.g 0.0
if ((nFloat === nInt) && (nString.indexOf('.') > -1)) {
return false;
}
// if a positive integer
// https://stackoverflow.com/a/10835227/8470877
return (0 === n % (!isNaN(nFloat) && 0 <= ~~n));
}
测试
"0" : true
"23" : true
"-10" : false
"10.30" : false
"-40.1" : false
"string" : false
"1234567890" : true
"129000098131766699.1" : false
"-1e10" : false
"1e10" : false
"1edf" : false
" " : false
"" : false
"0.01" : false
"0.00" : false
"-0" : false
"-0.0" : false
"0." : false
"-" : false
".1" : false
适用于node和90%以上浏览器(IE和Opera Mini除外)的现代解决方案是使用Number。isInteger后跟一个简单的正检查。
Number.isInteger(x) && x > 0
这是在ECMAScript 2015中完成的。
function isPositiveInteger(x) {
return Number.isInteger(x) && x > 0
}
Polyfil是:
Number.isInteger = Number.isInteger || function(value) {
return typeof value === 'number' &&
isFinite(value) &&
Math.floor(value) === value;
};
如果你需要支持字符串或数字形式的输入,那么你可以使用这个函数,在所有现有的答案(2/1/2018)在某种形式的输入上失败后,我写了一个大型测试套件。
function isPositiveInteger(v) {
var i;
return v && (i = parseInt(v)) && i > 0 && (i === v || ''+i === v);
}