【问题标题】:good enough 'is integer' check?足够好'是整数'检查吗?
【发布时间】:2013-09-16 04:20:37
【问题描述】:

这是一个足够好的“是整数”检查吗:

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

我想获得 true 表示 12、13、“14”、“-1”、Number.MAX_VALUE(不关心舍入问题)和 false 表示浮点数以及其他任何值。

这也可能非常接近:

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

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

【问题讨论】:

  • 你不能使用 parseInt,因为 typeof parseInt("A",10) === 'number' 返回 true
  • @user1671639 你在说什么? isint("A") 似乎工作得很好。 NaN == NaN 将返回 false。
  • 您对“足够好”的标准是什么?它是否适用于您给定的样本输入?是什么让你质疑它是否“足够好”?
  • @meagar Gotcha。我错过了 LHS,感谢您纠正我。

标签: javascript function integer


【解决方案1】:

一些与您的代码不同的示例:

'0x12' 这是因为Number()parseInt() 都尝试对数字进行JavaScript 样式解析——在这种情况下将数字解析为十六进制。 (但也许你对此没意见)。将 10 作为基数传递给 parseInt 的简单更改将修复这部分代码。

'1.0000000000000001' 这会出错,因为 JavaScript 数字无法存储足够的有效数字来表示这个数字。

我建议进行两项检查,一项针对数字,一项针对字符串。对于数字,您可以使用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

【讨论】:

  • 足够精确,也许有点矫枉过正,但做得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2016-03-29
  • 1970-01-01
  • 2011-05-25
  • 2016-07-03
  • 2013-11-11
  • 2010-09-23
相关资源
最近更新 更多