2013-06-27 26 views
11

Es scheint, als ob AngularJS angular.isNumber nicht funktioniert. Es funktioniert nicht mit Strings, die Zahlen sind. Mache ich etwas falsch? Soll ich einfach isNaN() verwenden?Warum funktioniert angular.isNumber() nicht wie erwartet?

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

Ich brauche etwas, um zu sehen, ob eine Zeichenfolge eine Zahl ist (wenn es tatsächlich ist) und angular.isNumber() werde mich nicht tun lassen, dass, wenn ich um 1 multiplizieren, aber wenn ich das dann tut, wird es immer wahr sein . Auch NaN ist keine Nummer (per Definition) und sollte daher false zurückgeben.

+1

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

+6

Was nicht funktioniert? '95 .55 'ist keine Zahl, es ist eine Zeichenkette. Gleichermaßen multipliziert JavaScript eine Zeichenfolge mit einer Zahl und analysiert diese Zeichenfolge als eine Zahl und versucht, die Operation auszuführen. Die Verkettung funktioniert anders, da Zahl + Zeichenfolge eine Zeichenfolge ist (JavaScript gibt die Zahl als Zeichenfolge aus). –

+0

@BradM Ich habe meine Frage hinzugefügt, um das Problem zu klären. –

Antwort

14

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

Wenn Sie einen String als Nummer erkennen müssen, muss er in Anzahl, konvertieren zurück zu String und vergleichen Sie dies vor dem Eingang, zum Beispiel.

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

Ich möchte nur darauf hinweisen, dass dies zu Rundungsfehlern führen kann, wenn Sie mit extrem kleinen oder extrem großen (String-) Zahlen arbeiten. –

+1

Ich würde nur diesen Link zu einem Problem auf eckigen Github-Seite hinzufügen, wo sie darauf verzichtet, wie nicht beheben: https://github.com/angular/angular.js/issues/701 – Capaj

+1

Warnung: Diese Methode gibt false für gültige Zahlen wie "0.0000005" seit (0.0000005) .toString() == "5e-7" in JavaScript. – joelnet

0

Ich arbeitete an dem gleichen Problem und ich versuchte, um diesen Randfall zu arbeiten. Also habe ich einen etwas anderen Ansatz erstellt.

FIDDLE

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