2013-06-28 7 views
6

Gibt es eine bessere Möglichkeit, die Anzahl der Dezimalstellen einer Zahl herauszufinden, als in meinem Beispiel?Der einfachste Weg, die Anzahl der Dezimalstellen in einer Zahl in JavaScript zu erhalten

var nbr = 37.435.45; 
var decimals = (nbr!=Math.floor(nbr))?(nbr.toString()).split('.')[1].length:0; 

Mit besser ich meine schneller ausführen und/oder mit einer nativen JavaScript-Funktion, dh. etwas wie nbr.getDecimals().

Vielen Dank im Voraus!

EDIT:

Nach series0ne Antwort ändern, ich der schnellste Weg ist gelänge:

var val = 37.435345; 
var countDecimals = function(value) { 
    if (Math.floor(value) !== value) 
     return value.toString().split(".")[1].length || 0; 
    return 0; 
} 
countDecimals(val); 

Geschwindigkeitstest: http://jsperf.com/checkdecimals

+2

Werfen Sie einen Blick auf diese sehr gründliche Antwort http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number – Archer

+0

Vielen Dank, aber die Fragesteller hat angegeben, dass es eine Dezimalzahl in den Zahlen geben muss, während ich nicht. +1 für den interessanten Link – PhilTrep

+0

@ PhilippeTrépanier, überlegen Sie, was es im großen Plan der Dinge wichtiger ist. Wie schnell wird das JavaScript ausgeführt (der Unterschied zwischen meiner Antwort und Pete D's ist minimal) und die Geschwindigkeit, die es auf den Client herunterlädt? Da Pete Ds Antwort ein paar Bytes kürzer ist, würde ich persönlich in einer misslichen Lage sein, in der man wählen könnte. – series0ne

Antwort

22
Number.prototype.countDecimals = function() { 
    if(Math.floor(this.valueOf()) === this.valueOf()) return 0; 
    return this.toString().split(".")[1].length || 0; 
} 

Wenn gebunden an den Prototyp, dies ermöglicht es Ihnen, um die Dezimalzahl (countDecimals();) direkt von einer Zahlenvariablen zu erhalten.

E.G.

var x = 23.453453453; 
x.countDecimals(); // 9 

Es funktioniert durch die Zahl in einen String konvertieren, Splitting am . und gibt den letzten Teil des Arrays zurück oder 0, wenn der letzte Teil des Arrays undefiniert ist (was passieren würde, wenn kein Dezimalpunkt vorhanden wäre).

Wenn Sie nicht dies dem Prototyp binden möchten, können Sie einfach verwenden:

var countDecimals = function (value) { 
    if(Math.floor(value) === value) return 0; 
    return value.toString().split(".")[1].length || 0; 
} 
+0

Danke, das ist genau das, was ich brauche! Ich nehme an, sobald meine Abklingzeit abgelaufen ist ... – PhilTrep

+0

Kein Problem, gern geschehen! :-) – series0ne

+5

Dies wird einen Fehler für Integer-Nummer erzeugen: http://jsfiddle.net/3bQqV/ Aber vielleicht ist es kein Problem für OP –

0

Regex sind sehr, sehr nicht effizient in Berechnungen, sie sind gemein, wenn Sie einen anderen Weg gehen. Also würde ich sie vermeiden :)

Dinge wie "Zahl% 1" geben den gerundeten Dezimalwert zurück (2,3% 1 = 0,2999999999999998), und generell würde ich Ihnen raten, Strings so früh wie möglich zu verwenden, seit Näherungen mit reellen Zahlen kann die Anzahl der Dezimalstellen ändern.

So ist deins in Ordnung, aber ich werde einen Weg suchen, um es zu optimieren.

Edit:

function CountDecimalDigits(number) 
{ 
    var char_array = number.toString().split(""); // split every single char 
    var not_decimal = char_array.lastIndexOf("."); 
    return (not_decimal<0)?0:char_array.length - not_decimal; 
} 
8

zu series0ne Antwort hinzufügen, wenn Sie den Code nicht einen Fehler für eine ganze Zahl werfen haben wollen und ein Ergebnis von 0 zu erhalten, wenn es keine Dezimalzahlen verwenden diese:

var countDecimals = function (value) { 
    if ((value % 1) != 0) 
     return value.toString().split(".")[1].length; 
    return 0; 
}; 
+0

+1 aussieht gut ... –

+1

vielleicht schneller wie es: 'var countDecimals = Funktion (Wert) { Rückgabewert% 1? value.toString(). split (". ") [1] .length: 0; }; ' –

+0

@OP Sie sollten Antworten in Jsperf testen, um zu sehen, welche die beste –

Verwandte Themen