我想用最简单的故障安全测试来检查JavaScript中的字符串是否是正整数。
isNaN(str)为所有非整数值返回true, parseInt(str)为浮点字符串返回整数,如“2.5”。我也不想使用一些jQuery插件。
我想用最简单的故障安全测试来检查JavaScript中的字符串是否是正整数。
isNaN(str)为所有非整数值返回true, parseInt(str)为浮点字符串返回整数,如“2.5”。我也不想使用一些jQuery插件。
当前回答
大多数情况下,您需要这种类型的数据库使用检查,如检查字符串是否有效的userId。正因为如此,不可能有任何奇怪的符号可以被分割成整数。此外,整数应该在数据库的整数范围内。你只需要普通的整数,比如1 2 3等等。
const isStrNormPosInt = (str: string) => {
return /^([1-9]\d*)$/.test(str) && Number(str) <= 2147483647 // postgres max int
}
如果检查通过了,你可以把它转换成number number (str)
其他回答
(~~a == a),其中a是字符串。
我的问题基本上是相同的:检查用户输入的数字是否为整数和正数。
我们的朋友Levi的代码和响应是我迄今为止在整个互联网上发现的最好的,在处理错误方面令人满意。
我在网站(https://bobbyhadz.com/blog/javascript-check-if-string-is-positive-integer):)上找到了下面的代码
function isPositiveInteger(str) {
if (typeof str !== 'string') {
return false;
}
const num = Number(str);
if (Number.isInteger(num) && num > 0) {
return true;
}
return false;
}
但是,对于1e10,它不能正确返回。
ES6:
Number.isInteger(Number(theNumberString)) && Number(theNumberString) > 0
解决方案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/
看起来正则表达式是可行的:
var isInt = /^\+?\d+$/.test('the string');