Почему 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.

Ответ 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

Ответ 2

Я работал над одной и той же проблемой, и я пытался обойти этот край. Поэтому я создал несколько иной подход.

FIDDLE

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