2013-06-28 21 views
6

Esiste un modo migliore per calcolare il numero di decimali su un numero rispetto al mio esempio?Il modo più semplice per ottenere il numero di decimali in un numero in JavaScript

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

Per meglio intendo più veloce da eseguire e/o utilizzando una funzione JavaScript nativa, vale a dire. qualcosa come nbr.getDecimals().

Grazie in anticipo!

EDIT:

Dopo aver modificato la risposta series0ne, il modo più veloce ho potuto gestire è: prova

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

Velocità: http://jsperf.com/checkdecimals

+2

Dai un'occhiata a questa risposta molto approfondita http://stackoverflow.com/questions/10454518/javascript-how-to-retrieve-the-number-of-decimals-of-a-string-number – Archer

+0

Grazie ma il il richiedente specificò che deve esserci un decimale nei numeri mentre io no. +1 per il link interessante – PhilTrep

+0

@ PhilippeTrépanier, considera ciò che è più importante nel grande schema delle cose. Quanto velocemente esegue JavaScript (la differenza tra la mia risposta e Pete D è minima) e la velocità che scarica sul client? Dal momento che la risposta di Pete D è di pochi byte più brevi, Personalmente sarei in una situazione in cui scegliere. – series0ne

risposta

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

Quando è legato al prototipo, questo ti permette per ottenere il conteggio decimale (countDecimals();) direttamente da una variabile numerica.

E.G.

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

E funziona convertendo il numero in una stringa, scissione presso il . e restituisce l'ultima parte dell'array o 0 se l'ultima parte dell'array è indefinita (che si verificherà se non fosse presente un punto decimale).

Se non si desidera associare questo al prototipo, si può semplicemente utilizzare questo:

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

Grazie, è esattamente ciò di cui ho bisogno! Accetterò appena il mio cooldown sarà finito ... – PhilTrep

+0

Nessun problema, prego! :-) – series0ne

+5

Questo produrrà un errore per il numero intero: http://jsfiddle.net/3bQqV/ Ma forse non è un problema per OP –

0

Regex non sono molto molto efficienti nei calcoli, sono media se si può andare in un altro modo. Quindi li eviterei :)

Cose come "Numero% 1" restituiscono il valore decimale arrotondato (2.3% 1 = 0.2999999999999998), e in generale consiglio di utilizzare le stringhe il più presto possibile, poiché le approssimazioni con numeri reali può cambiare il numero di decimali.

Quindi il tuo va bene, ma cercherò di ottimizzarlo.

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

aggiunta alla risposta series0ne se si vuole avere il codice non genera un errore per un numero intero e ottenere un risultato di 0 quando non ci sono i decimali utilizzare questo:

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

+1 look buono ... –

+1

forse più veloce come questo: 'var countDecimals = function (value) { valore restituito% 1? value.toString(). split (". ") [1] .length: 0; }; ' –

+0

@OP è necessario verificare le risposte in jsperf per vedere quale sembra la migliore –

Problemi correlati