问题 为什么angular.isNumber()没有按预期工作?


看起来好像是AngularJS的 angular.isNumber 不管用。它不适用于数字字符串。难道我做错了什么?我应该使用 isNaN()

angular.isNumber('95.55') == false
angular.isNumber('95.55' * 1) == true
angular.isNumber('bla' * 1) == true
angular.isNumber(NaN) == true

我需要一些东西来看看一个字符串是否是一个数字(当它实际上是)和 angular.isNumber() 我不会让我这样做,除非我乘以1,但如果我这样做,那么它将永远是真的。也 NaN 不是数字(根据定义),所以应该返回false。


4415
2018-06-27 19:40


起源

stackoverflow.com/questions/2801601/... - RonSper
什么不起作用? '95 .55'不是数字,而是字符串。同样,将字符串乘以数字,javascript会将该字符串解析/转换为数字并尝试执行操作。连接的工作方式不同,因为数字+字符串将是一个字符串(javascript将数字转换为字符串)。 - Brad M
使用如下:angular.isNumber(+ num || num),如果num是字符串/对象/等等,则在NaN上是首选。所以,它实际上检查源是否是数字。 - a8m
查看 stackoverflow.com/a/1830844/504836 为了工作 IsNumeric 方法。 - joelnet
我投票这不是链接问题的重复。这个问题是关于angularJS isNumber方法的预期行为。它与NaN是否被视为“数字”类型无关。 - Dave Rager


答案:


JavaScript的typeof NaN === 'number'

如果你需要识别一个  作为一个 把它投到 ,转换回来  例如,将此与输入进行比较。

function stringIsNumber(s) {
    var x = +s; // made cast obvious for demonstration
    return x.toString() === s;
}

stringIsNumber('95.55'); // true
stringIsNumber('foo'); // false
// still have
stringIsNumber('NaN'); // true

14
2018-06-27 19:48



只是想指出,如果您处理极小或极大(字符串)的数字,这可能会受到舍入错误的影响。 - Paul S.
我只是将这个链接添加到angular github页面上的一个问题,在那里他们放弃了它,因为它不会修复: github.com/angular/angular.js/issues/701 - Capaj
警告:此方法对于有效数字(如“0.0000005”,因为(0.0000005).toString()==“5e-7”在JavaScript中返回false)。 - joelnet
@joelnet没有考虑过那些类型的情况。会在哪里 +x.toString() === x 失败?您可以考虑这些边缘情况 - Paul S.


使用如下,

angular.isNumber(eval('99.55'))

对于其他表达,我们也可以使用 eval(input)

注意: eval() 是一个JavaScript方法


1
2018-06-05 17:21





我正在研究同样的问题,我正试图解决这个边缘案例。所以我创建了一个略有不同的方法。

小提琴

function isStringNumber(str) {
  var parsed = parseFloat(str);
  var casted = +str;
  return parsed === casted  && !isNaN(parsed) && !isNaN(casted);
}

0
2017-10-18 16:07