足够好'是整数'检查?

时间:2013-09-16 04:20:38

标签: javascript function integer

这是否足够'是整数'检查:

function isint( o ) {
    return Number( o ) === parseInt( o );
}

我想得到true,例如12,13,'14',' - 1,Number.MAX_VALUE,(不关心舍入问题)和false for floats,等等。

这也可能非常接近:

function isint( o ) {
    try {
        return eval( o ) === parseInt( Number( o ), 10 );
    } catch (e) {}
        return false
}

另外一个问题:Number.MAX_VALUE浮动?

1 个答案:

答案 0 :(得分:1)

一些打破代码的例子:

<强> '×12' 这会分解,因为Number()parseInt()都试图对数字进行JavaScript样式解析 - 在这种情况下将数字解析为十六进制。 (但也许你对此感到满意)。将10作为基数传递给parseInt的简单更改将修复代码的这一部分。

'1.0000000000000001'这会因为JavaScript编号无法存储足够的有效数字来表示此数字而中断。

我建议做两个检查,一个用于Numbers,一个用于Strings。对于Numbers,您可以使用floor()查看舍入时数字是否发生变化。对于字符串,使用RegExp检查字符串是否只包含“ - ”和数字。类似的东西:

function isint(o) {
  if (typeof o === 'number') {
    // o is an int if rounding down doesn't change it.
    return Math.floor(o) === o;
  }
  else if (typeof o === 'string' &&
           /^-?\d+$/.test(o)) { // match '-' (optional) followed by 1 or more digits
    // o is an int if parsing the string, and toString()ing it gets you the same value 
    var num = Number(o);
    return num.toString() === o;
  }
  return false;
}

试一试:

[12, 13, '14', '-1', '0x12', '1.0000000000000001'].forEach(function(x) {
  console.log(x + ' isInt = ' + isint(x));
});

打印:

12 isInt = true
13 isInt = true
14 isInt = true
-1 isInt = true
0x12 isInt = false
1.0000000000000001 isInt = false