2013-06-27 2 views
11

Похоже, что angular.isNumber AngularJS не работает. Он не работает со строками, которые являются числами. Я делаю что-то неправильно? Должен ли я просто использовать isNaN()?Почему angular.isNumber() работает не так, как ожидалось?

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

http://stackoverflow.com/questions/2801601/why-does-typeof-nan-return-number – RonSper

+6

Что не работает? '95 .55 'не является числом, это строка. Точно так же, умножая строку на число, javascript будет анализировать/отличать эту строку как число и делать операцию. Конкатенация работает по-разному, так как number + string будет строкой (javascript выводит число как строку). –

+0

@BradM Я добавил к своему вопросу, чтобы помочь прояснить проблему. –

ответ

14

В 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 
+2

Просто хочу указать, что это может привести к ошибкам округления, если вы имеете дело с чрезвычайно маленькими или чрезвычайно большими (строковыми) числами. –

+1

Я бы просто добавил эту ссылку к проблеме на угловой странице github, где они отказались от нее, так как не исправили: https://github.com/angular/angular.js/issues/701 – Capaj

+1

ВНИМАНИЕ: Этот метод возвращает false для допустимые числа, такие как «0.0000005», поскольку (0.0000005) .toString() == «5e-7» в JavaScript. – joelnet

0

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

FIDDLE

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