我正在检查使用函数的integer
值。出乎意料的是,此函数将, ,之类的字符串验证为数字,因为这些字符串是指数值。有什么办法可以解决这个问题?在实际情况下,我不会得到任何指数值。node.js
IsNaN
1E267146
1E656716
914E6583
问问题
1876 次
4 回答
3
Javascript
function isInteger(nVal) {
return typeof nVal === "number" && isFinite(nVal) && nVal > -9007199254740992 && nVal < 9007199254740992 && Math.floor(nVal) === nVal;
}
但这也将接受科学记数法
console.log(isInteger(1e6));
console.log(isInteger(+"1e6"));
你需要清楚你的定义/期望是什么。
我的猜测是,如果您正在测试字符串并且对最大或最小整数没有限制,您可能想要这样的东西。
Javascript
function isStringNumericalInteger(testValue) {
return typeof testValue === "string" && /^[\-+]?[1-9]{1}\d+$|^[\-+]?0$/.test(testValue);
}
console.log(isStringNumericalInteger("9007199254740991"));
console.log(isStringNumericalInteger("-123216848516878975616587987846516879844651654847"));
console.log(isStringNumericalInteger("1.1"));
console.log(isStringNumericalInteger("-1.1"));
console.log(isStringNumericalInteger("1e10"));
console.log(isStringNumericalInteger("010"));
console.log(isStringNumericalInteger("0x9"));
console.log(isStringNumericalInteger(""));
console.log(isStringNumericalInteger(" "));
console.log(isStringNumericalInteger());
console.log(isStringNumericalInteger(null));
console.log(isStringNumericalInteger([]));
console.log(isStringNumericalInteger({}));
输出
true
true
false
false
false
false
false
false
false
false
false
false
false
如果您想将范围绑定到 javascript 可以用数字表示为整数的范围,那么您需要添加一个测试&& +testValue > -9007199254740992 && +testValue < 9007199254740992
如果您不喜欢使用 RegEx,您也可以使用解析器来完成此操作。像这样的东西:
Javascript
function isCharacterDigit(testCharacter) {
var charCode = testCharacter.charCodeAt(0);
return charCode >= 48 && testCharacter <= 57;
}
function isStringNumericalInteger(testValue) {
var start = 0,
character,
index,
length;
if (typeof testValue !== "string") {
return false;
}
character = testValue.charAt(start);
if (character === "+" || character === "-") {
start += 1;
character = testValue.charAt(start);
}
start += 1;
length = testValue.length;
if ((length > start && character === "0") || !isCharacterDigit(character)) {
return false;
}
for (index = start; index < length; index += 1) {
if (!isCharacterDigit(testValue.charAt(index))) {
return false;
}
}
return true;
}
于 2013-09-28T10:59:07.083 回答
-2
我会使用类似下面的代码来验证数字输入。首先我将给定的值解析为浮点数,然后检查 isNaN()。
var isNumber = function (obj) {
return !isNaN(parseFloat(obj)) && isFinite(obj);
};
于 2013-09-28T09:21:15.837 回答
-2
我认为这就是您所需要的(我讨厌正则表达式,因为这对性能不是很好,但是..)
var NMAX = Math.pow(2, 53);
function isNumeric(n) {
n = n < 0 ? n * -1 : n;
var r = /^\d+$/.test(n);
if (r === true)
{
return parseInt(n, 10) >= (NMAX * -1) + 1 && parseInt(n, 10) <= NMAX;
}
return false;
}
缩小
var NMAX = Math.pow(2, 53);
function isNumericMin(n) {
n = n < 0 ? n * -1 : n;
return /^\d+$/.test(n) === true ? parseInt(n, 10) >= (NMAX * -1) + 1 && parseInt(n, 10) <= NMAX : false;
}
于 2013-09-28T10:07:07.517 回答
-2
var i = '1E267146' if(isNaN(i) || !isFinite(i) !! i=="") { // 做事 } else { // 做事 }
于 2013-09-28T11:44:37.143 回答