Come posso trovare la lunghezza di un numero?


161

Sto cercando di ottenere la lunghezza di un numero in JavaScript o jQuery?

Ho provato value.lengthsenza successo, devo prima convertirlo in una stringa?


3
Sì, convertilo in una stringa. Il concetto di "lunghezza" di un numero è significativo solo in termini di alcuni schemi di rappresentazione numerica.
Pointy

Sì, devi prima convertirlo nella stringa, IE (1234) .toString (). Length
Osama Bari

Benchmark per le prime 3 risposte: measurethat.net/Benchmarks/ShowResult/92276
Richie Bendall

Risposte:


304
var x = 1234567;

x.toString().length;

Questo processo funzionerà anche per Float Numbere per Exponential number.


9
Fatto +1. Nel caso in cui non sia ovvio per nessuno, il punto decimale nei float verrà conteggiato nella lunghezza della stringa. ad es. 2.5.toString (). output di lunghezza 3.
dading84

1
@ dading84: suppongo che Math.floor () avrebbe risolto il problema: Math.floor (99.5454) .toString (). length === 2
Manfred

7
Questa soluzione non funzionerebbe con numeri grandi o piccoli che hanno più di 20 cifre. per esempio. 1,2e + 22 toString (). Uscite di lunghezza 7
CherylG

Anche notare che questo è estremamente lento. Ho fatto un test nel nodo e risulta che è più del 1200% più lento della risposta di Arturs.
Oliver Dixon,

1
Non è una buona soluzione, esempio: const val = 0295; const x = val.toString (). length; console.log (x) // l'output è: 3
karolkarp il

82

Ok, tante risposte, ma questa è pura matematica, solo per divertimento o per ricordare che la matematica è importante:

var len = Math.ceil(Math.log(num + 1) / Math.LN10);

Questo in realtà fornisce la "lunghezza" del numero anche se è in forma esponenziale. numdovrebbe essere un numero intero non negativo qui: se è negativo, prendi il suo valore assoluto e regola il segno in seguito.

Aggiornamento per ES2015

Ora che Math.log10è una cosa , puoi semplicemente scrivere

const len = Math.ceil(Math.log10(num + 1));

1
penso che questa matematica pura sia la più efficiente / veloce.
Noitidart,

2
Fantastico uomo grazie. I risultati ottenuti mostrano che la matematica è veloce, è questo il risultato che hai ottenuto? ecco il mio risultato: i.imgur.com/9BKxyd3.png
Noitidart

1
@HubertGrzeskowiak Oh, è carino. Vedo che il metodo è sostanzialmente un metodo matematico comunque, ma con alcuni hack di velocità. Rilascia a Math.ceile usa Math.absinvece un più veloce . Ma sinceramente non mi aspettavo quel guadagno in termini di prestazioni in Chrome ... Bello da sapere!
MaxArt,

3
Perfetto, ma dà 0 se il tuo numero è 0 invece 1
StateLess

1
A 1e + 16 o più fornisce 1 in meno, quindi 10000000000000000 restituisce 16 invece di 17 e così via ...
Goty Metal

12

Ho usato questa funzionalità in node.js, questa è la mia implementazione più veloce finora:

var nLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1; 
}

Dovrebbe gestire numeri interi positivi e negativi (anche in forma esponenziale) e dovrebbe restituire la lunghezza della parte intera in float.

Il seguente riferimento dovrebbe fornire alcune informazioni sul metodo: Weisstein, Eric W. "Lunghezza del numero". Da MathWorld - Una risorsa Web Wolfram.

Credo che alcune operazioni bit per bit possano sostituire Math.abs, ma jsperf mostra che Math.abs funziona perfettamente nella maggior parte dei motori js.

Aggiornamento : come notato nei commenti, questa soluzione presenta alcuni problemi :(

Update2 (soluzione alternativa) : credo che ad un certo punto si verifichino problemi di precisione e che il Math.log(...)*0.434...giusto si comporti inaspettatamente. Tuttavia, se Internet Explorer o i dispositivi mobili non sono la tua tazza di tè, puoi sostituire questa operazione con la Math.log10funzione. In Node.js ho scritto un rapido test di base con la funzione nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;e con Math.log10essa ha funzionato come previsto. Si noti che Math.log10non è universalmente supportato.


Come curiosità ho eseguito un JsPerf con metodo nLength contro toString (). Lunghezza su questo .... jsperf.com/convert-number-to-string-and-get-length/2
Israfil Havilah

Haha, questa è sostanzialmente la soluzione che ho fornito! Non avevo idea che potesse funzionare così bene.
MaxArt,

2
Mi dispiace, ho detto qualcosa su di me inventando la soluzione o qualcosa del genere? Perché non leggi attentamente prima di pubblicare? Per la verità, l'algoritmo è stato scoperto molto prima della nascita di Steven Wolfram, e comunque la pagina che hai collegato non fornisce una soluzione in Javascript. L'ho fatto, 9 mesi prima di te.
MaxArt,

1
Il "+1" dovrebbe essere probabilmente al di fuori della chiamata di Math.abs: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak

1
A 1e + 16 o più fornisce 1 in meno, quindi 10000000000000000 restituisce 16 invece di 17 e così via ...
Goty Metal

11

Devi rendere il numero da stringere per prendere la lunghezza

var num = 123;

alert((num + "").length);

o

alert(num.toString().length);

9

Potrebbe anche utilizzare una stringa di modello:

const num = 123456
`${num}`.length // 6

questa è l'unica risposta che funziona per me perché conto un numero che inizia con 0.
jessiPP

5

Bene senza convertire il numero intero in una stringa potresti creare un loop funky:

var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
     ++length;
     i = Math.floor(i/10);
}

alert(length);​

Demo: http://jsfiddle.net/maniator/G8tQE/


3
@Pointy sì, questo presuppone un numero intero. Anche se lo rendi una stringa, includerà il .componente come parte del calcolo.
Naftali aka Neal,

sì, anche se è una domanda filosofica interessante se il punto debba essere incluso nella "lunghezza" :-)
Pointy

4

Per prima cosa convertilo in una stringa:

var mynumber = 123;
alert((""+mynumber).length);

L'aggiunta di una stringa vuota ad essa implicitamente causerà la mynumbertrasformazione in una stringa.


1
Non funziona con esponenziali come 1e + 16 che restituisce 5.
Goty Metal

4

Ci sono tre modi per farlo.

var num = 123;
alert(num.toString().length);

migliore performance one (miglior performance in ie11)

var num = 123;
alert((num + '').length);

Matematica (migliori prestazioni in Chrome, Firefox ma più lente in ie11)

var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)

c'è un jspref qui http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2


4

Dovresti optare per il più semplice (stringLength), la leggibilità batte sempre la velocità. Ma se ti interessa la velocità, eccone alcuni qui sotto.

Tre diversi metodi tutti con velocità variabile.

// 34ms
let weissteinLength = function(n) { 
    return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}

// 350ms
let stringLength = function(n) {
    return n.toString().length;
}

// 58ms
let mathLength = function(n) {
    return Math.ceil(Math.log(n + 1) / Math.LN10);
}

// Simple tests below if you care about performance.

let iterations = 1000000;
let maxSize = 10000;

// ------ Weisstein length.

console.log("Starting weissteinLength length.");
let startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    weissteinLength(Math.random() * maxSize);
}

console.log("Ended weissteinLength length. Took : " + (Date.now() - startTime ) + "ms");


// ------- String length slowest.

console.log("Starting string length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    stringLength(Math.random() * maxSize);
}

console.log("Ended string length. Took : " + (Date.now() - startTime ) + "ms");


// ------- Math length.

console.log("Starting math length.");
startTime = Date.now();

for (let index = 0; index < iterations; index++) {
    mathLength(Math.random() * maxSize);
}

3

Mi è stata posta una domanda simile in un test.

Trova la lunghezza di un numero senza convertirla in stringa

const numbers = [1, 10, 100, 12, 123, -1, -10, -100, -12, -123, 0, -0]

const numberLength = number => {

  let length = 0
  let n = Math.abs(number)

  do {
    n /=  10
    length++
  } while (n >= 1)

  return length
}

console.log(numbers.map(numberLength)) // [ 1, 2, 3, 2, 3, 1, 2, 3, 2, 3, 1, 1 ]

Sono stati aggiunti numeri negativi per complicarlo un po 'di più, quindi Math.abs ().


2

Vorrei correggere la risposta @Neal che era abbastanza buona per gli interi, ma il numero 1 restituiva una lunghezza di 0 nel caso precedente.

function Longueur(numberlen)
{
    var length = 0, i; //define `i` with `var` as not to clutter the global scope
    numberlen = parseInt(numberlen);
    for(i = numberlen; i >= 1; i)
    {
        ++length;
        i = Math.floor(i/10);
    }
    return length;
}


0

Sì, è necessario convertire in stringa per trovare la lunghezza, ad esempio

var x=100;// type of x is number
var x=100+"";// now the type of x is string
document.write(x.length);//which would output 3.
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.