【问题标题】:Why is angular.isNumber() not working as expected?为什么 angular.isNumber() 没有按预期工作?
【发布时间】:2020-02-14 17:57:45
【问题描述】:

似乎 AngularJS 的 angular.isNumber 不起作用。它不适用于数字字符串。难道我做错了什么?我应该只使用isNaN()吗?

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

我需要一些东西来查看一个字符串是否是一个数字(实际上是),除非我乘以 1,否则angular.isNumber() 不会让我这样做,但如果我这样做,那么它总是正确的。 NaN 也不是数字(根据定义),因此应该返回 false。

【问题讨论】:

  • 什么不起作用? '95.55' 不是一个数字,它是一个字符串。同样,将一个字符串乘以一个数字,javascript 会将该字符串解析/转换为一个数字并尝试执行该操作。连接的工作方式不同,因为数字 + 字符串将是一个字符串(javascript 将数字转换为字符串)。
  • 像这样使用:angular.isNumber(+num || num),如果 num 是字符串/对象/等。在 NaN 上是首选。所以,它实际上是检查源是否为数字。
  • 查看stackoverflow.com/a/1830844/504836 以获取有效的IsNumeric 方法。
  • 我认为这不是链接问题的重复。这个问题是关于 angularJS isNumber 方法的预期行为。它与 NaN 是否被视为“数字”类型无关。

标签: javascript angularjs


【解决方案1】:

JavaScript 中,typeof NaN === 'number'.

如果您需要将 String 识别为 Number,请将其转换为 Number,再转换回 String 并将其与输入进行比较,例如。

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

【讨论】:

  • 只想指出,如果您处理极小或极大(字符串)的数字,这可能会出现舍入错误。
  • 我只想将此链接添加到 angular github 页面上的问题中,他们放弃了它,因为无法修复:github.com/angular/angular.js/issues/701
  • 警告:此方法对有效数字(如“0.0000005”)返回 false,因为 JavaScript 中的 (0.0000005).toString() == “5e-7”。
  • @joelnet 没有考虑过这种情况。 +x.toString() === x 会在哪里失败?您也许可以考虑这些边缘情况
【解决方案2】:

我正在解决同样的问题,并试图解决那个边缘情况。所以我创建了一个稍微不同的方法。

FIDDLE

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

【讨论】:

    【解决方案3】:

    如下使用,

    angular.isNumber(eval('99.55'))
    

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

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

    编辑: 不推荐使用eval(),文档上写着Never use eval()!

    感谢@Diogo Kollross

    【讨论】:

    猜你喜欢
    • 2014-08-04
    • 2021-01-03
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2021-03-20
    相关资源
    最近更新 更多