我正在使用integer
函数检查node.js
中的IsNaN
值。
出乎意料的是,此函数将1E267146
,1E656716
,914E6583
等字符串验证为数字,因为这些字符串是指数值。有办法解决这个问题吗?在实际情况中,我不会得到任何指数值。
答案 0 :(得分: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
添加一个测试
如果您不喜欢使用RegExs,您也可以使用解析器完成此操作。像这样:
的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;
}
答案 1 :(得分:-2)
我会使用类似下面的代码来验证数字输入。首先,我将给定的值解析为float,然后检查isNaN()。
var isNumber = function (obj) {
return !isNaN(parseFloat(obj)) && isFinite(obj);
};
答案 2 :(得分:-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;
}
答案 3 :(得分:-2)
var i ='1E267146' if(isNaN(i)||!isFinite(i)!! i ==“”) { // 做东西 } 其他 { // 做东西 }