Ottieni il numero di cifre con JavaScript


124

Come suggerisce il titolo del mio post, vorrei sapere quante cifre var numberha. Ad esempio: se la number = 15;mia funzione dovesse tornare 2. Attualmente è simile a questo:

function getlength(number) {
  return number.toString().length();
}

Ma Safari dice che non funziona a causa di TypeError:

'2' is not a function (evaluating 'number.toString().length()')

Come puoi vedere, '2'è effettivamente la soluzione giusta. Ma perché è così not a function?

Risposte:


229

lengthè una proprietà, non un metodo. Non puoi chiamarlo, quindi non hai bisogno di parentesi ():

function getlength(number) {
    return number.toString().length;
}

AGGIORNAMENTO: come discusso nei commenti, l'esempio sopra non funzionerà per i numeri in virgola mobile. Per farlo funzionare possiamo o sbarazzarsi di un periodo con String(number).replace('.', '').length, o contare le cifre con espressione regolare: String(number).match(/\d/g).length.

In termini di velocità, potenzialmente il modo più veloce per ottenere il numero di cifre nel numero dato è farlo matematicamente. Per i numeri interi positivi esiste un meraviglioso algoritmo con log10:

var length = Math.log(number) * Math.LOG10E + 1 | 0;  // for positive integers

Per tutti i tipi di numeri interi (compresi i negativi) esiste una brillante soluzione ottimizzata da @ Mwr247 , ma fai attenzione all'uso Math.log10, poiché non è supportata da molti browser legacy. Quindi la sostituzione Math.log10(x)con Math.log(x) * Math.LOG10Erisolverà il problema di compatibilità.

Creare soluzioni matematiche veloci per i numeri decimali non sarà facile a causa del ben noto comportamento della matematica in virgola mobile , quindi l'approccio cast-to-string sarà più facile e infallibile. Come menzionato da @streetlogics, il casting veloce può essere eseguito con una semplice concatenazione da numero a stringa, portando la soluzione di sostituzione a essere trasformata in:

var length = (number + '').replace('.', '').length;  // for floats

3
buona tecnica per ottenere un numero di cifre, ma, se fosse un numero di frazione, cioè 12,5, la tua funzione restituirà 4 invece di 3 ...
Swarnendu Paul

@ Swarnendu: non è un problema perché ho solo numeri interi.
bit4fox

3
Altrimenti usa qualcosa di simile number.toString().match(/\d/g).length.
VisioN

1
@Bakudan - Questa risposta sembra essere stata corretta. Puoi eliminare i tuoi due commenti criticandoli ora (in modo che le persone future non si confondano e pensino che il codice in questa risposta non funzioni.)
ArtOfWarfare

1
@ 3ocene Buona intuizione! Il valore rimane lo stesso ma dietro le quinte viene convertito in numero intero. x | 0è solo un'altra versione breve e veloce di Math.floor(x), che arrotonda per difetto il numero. Puoi ottenere lo stesso con ~~x. La seguente domanda fornisce ulteriori spiegazioni sul punto: stackoverflow.com/q/9049677/1249581 .
VisioN

66

Ecco una risposta matematica (funziona anche per i numeri negativi):

function numDigits(x) {
  return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;
}

E una versione ottimizzata di quanto sopra (operazioni bit per bit più efficienti):

function numDigits(x) {
  return (Math.log10((x ^ (x >> 31)) - (x >> 31)) | 0) + 1;
}

In sostanza, iniziamo ottenendo il valore assoluto dell'input per consentire ai valori negativi di funzionare correttamente. Quindi eseguiamo l'operazione attraverso il log10 per darci quale potenza di 10 è l'input (se lavorassi in un'altra base, useresti il ​​logaritmo per quella base), che è il numero di cifre. Quindi pianifichiamo l'output per afferrare solo la parte intera di quello. Infine, utilizziamo la funzione max per correggere i valori decimali (qualsiasi valore frazionario compreso tra 0 e 1 restituisce solo 1, invece di un numero negativo) e aggiungiamo 1 all'output finale per ottenere il conteggio.

Quanto sopra presume (in base al tuo esempio di input) che desideri contare il numero di cifre in numeri interi (quindi 12345 = 5, e quindi 12345.678 = 5). Se desideri contare il numero totale di cifre nel valore (quindi 12345.678 = 8), aggiungilo prima del "ritorno" in una delle due funzioni sopra:

x = Number(String(x).replace(/[^0-9]/g, ''));


2
@ Tx3 Buona nota! Per fortuna, Math.LOG10Eesiste da ES1, il che significa Math.log(x) * Math.LOG10Eche funzionerà per la compatibilità.
Mwr247

Penso che questa funzione non funzioni: `` funzione numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov

@lokhmakov Questo perché il secondo numero che hai dato supera il valore intero massimo di 32 bit di JavaScript, che gli operatori bit per bit (^, >>, |) non possono gestire correttamente.
Mwr247

1
Vero. Ci si dovrebbe aspettare che JS funzioni solo con max safe int, e quel numero è molto più grande di quanto quasi chiunque avrebbe bisogno per qualsiasi cosa. Sto sviluppando un gioco con numeri molto grandi e non potrei usare il codice ottimizzato a causa di quella limitazione, e ho pensato di commentare per salvare chiunque altro in una barca simile dall'avere rotto il codice in seguito. Ottima risposta a proposito.
Justin

20

Poiché questo è emerso da una ricerca su Google per "javascript get number of digits", volevo dire che esiste un'alternativa più breve a questa che si basa sul casting interno da fare per te:

var int_number = 254;
var int_length = (''+int_number).length;

var dec_number = 2.12;
var dec_length = (''+dec_number).length;

console.log(int_length, dec_length);

I rendimenti

3 4

4
E un rapido jsperf mostra che anche questo è MOLTO più veloce (come, 10 volte o più): jsperf.com/number-tostring-vs-number
Ledivin

NOTA! Conta anche il punto come un numero. (in dec_number)
Sebastian Norr

2

Se hai bisogno di cifre (dopo il separatore), puoi semplicemente dividere il numero e contare la seconda parte della lunghezza (dopo il punto).

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}

2

var i = 1;
while( ( n /= 10 ) >= 1 ){ i++ }

23432          i = 1
 2343.2        i = 2
  234.32       i = 3
   23.432      i = 4
    2.3432     i = 5
    0.23432


1

Sto ancora imparando Javascript, ma tempo fa mi è venuta questa funzione in C, che utilizza la matematica e un ciclo while anziché una stringa, quindi l'ho riscritta per Javascript. Forse questo potrebbe essere fatto in modo ricorsivo in qualche modo, ma non ho ancora capito il concetto :( Questo è il meglio che sono riuscito a trovare. Non sono sicuro di quanti numeri funzioni, ha funzionato quando ho inserito un centinaio cifre.

function count_digits(n) {
    numDigits = 0;
    integers = Math.abs(n);

    while (integers > 0) {
        integers = (integers - integers % 10) / 10;
        numDigits++;
    }
    return numDigits;
}

modifica: funziona solo con valori interi


1

Nota: questa funzione ignorerà i numeri dopo il punto medio decimale , se vuoi contare con decimale, rimuovi il Math.floor(). Direttamente al punto controlla questo!

function digitCount ( num )
{
     return Math.floor( num.toString()).length;
}

 digitCount(2343) ;

// ES5 +

 const digitCount2 = num => String( Math.floor( Math.abs(num) ) ).length;

 console.log(digitCount2(3343))

Fondamentalmente cosa sta succedendo qui. toString()e la String()stessa funzione incorporata per convertire una cifra in una stringa, una volta convertita, troveremo la lunghezza della stringa tramite la funzione incorporata length.

Avviso: ma questa funzione non funzionerebbe correttamente per un numero negativo, se stai cercando di giocare con un numero negativo, controlla questa risposta o semplicemente inseriscila Math.abs();

Cheer You!


1
`You can do it by simple loop using Math.trunc() function. if in interview interviewer ask to do it without converting it into string`
    let num = 555194154234 ;
    let len = 0 ;
    const numLen = (num) => {
     for(let i = 0; i < num ||  num == 1 ; i++){
        num = Math.trunc(num/10);
        len++ ;
     }
      return len + 1 ;
    }
    console.log(numLen(num));

0

Due cifre: funzione semplice nel caso in cui siano necessarie due o più cifre di un numero con ECMAScript 6 (ES6):

const zeroDigit = num => num.toString().length === 1 ? `0${num}` : num;

0

Dichiarazione del problema: conteggio numero / stringa che non utilizza string.length () jsfunction. Soluzione: potremmo farlo tramite Forloop. per esempio

for (x=0; y>=1 ; y=y/=10){
  x++;
}

if (x <= 10) {
  this.y = this.number;                
}   

else{
  this.number = this.y;
}    

}


0

Ecco la mia soluzione. Funziona con numeri positivi e negativi. Spero che questo ti aiuti

function findDigitAmount(num) {

   var positiveNumber = Math.sign(num) * num;
   var lengthNumber = positiveNumber.toString();

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

0

sarebbe semplice ottenere la lunghezza come

  `${NUM}`.length

dove NUM è il numero di cui ottenere la lunghezza


0

Puoi usare in questo trucco

(''+number).length


0

Utilizzare la seguente espressione per ottenere la lunghezza del numero.

length = variableName.toString().length

-7

La proprietà length restituisce la lunghezza di una stringa (numero di caratteri).

La lunghezza di una stringa vuota è 0.

var str = "Hello World!";
var n = str.length;

Il risultato di n sarà: 12

    var str = "";
    var n = str.length;

Il risultato di n sarà: 0


Proprietà lunghezza array:


La proprietà length imposta o restituisce il numero di elementi in un array.

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.length;

Il risultato sarà: 4

Sintassi:

Restituisce la lunghezza di un array:

array.length

Imposta la lunghezza di un array:

array.length=number

2
Questo non risponde alla domanda
Steve Taylor il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.