¿Cómo puedo encontrar la longitud de un número?

161

Estoy buscando obtener la longitud de un número en JavaScript o jQuery?

Lo he intentado value.lengthsin éxito, ¿primero necesito convertir esto en una cadena?

Code Junkie
fuente
3
Sí, conviértalo en una cadena. El concepto de "longitud" de un número solo es significativo en términos de algún esquema de representación numérica.
Puntiagudo
Sí, primero debe convertir a la cadena, IE (1234) .toString (). Length
Osama Bari
Puntos de
Richie Bendall

Respuestas:

304
var x = 1234567;

x.toString().length;

Este proceso también funcionará por Float Numbery para Exponential numbertambién.

thecodeparadox
fuente
9
+1 En caso de que no sea obvio para nadie, el punto decimal en flotantes se contará en la longitud de la cadena. por ejemplo, 2.5.toString (). salidas de longitud 3.
dading84
1
@ dading84: supongo que Math.floor () solucionaría eso: Math.floor (99.5454) .toString (). length === 2
Manfred
77
Esta solución no funcionaría con números grandes o pequeños que tengan más de 20 dígitos. p.ej. 1.2e + 22 toString (). Salidas de longitud 7
CherylG
También notar que esto es extremadamente lento. Hice una prueba en el nodo y resulta que es más de un 1200% más lenta que la respuesta de Arturs.
Oliver Dixon
1
No es una buena solución, ejemplo: const val = 0295; const x = val.toString (). length; console.log (x) // salida es: 3
karolkarp
82

Ok, muchas respuestas, pero esta es pura matemática, solo por diversión o para recordar que las matemáticas son importantes:

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

Esto realmente da la "longitud" del número, incluso si está en forma exponencial. numse supone que es un número entero no negativo aquí: si es negativo, tome su valor absoluto y ajuste el signo después.

Actualización para ES2015

Ahora que Math.log10es una cosa , simplemente puedes escribir

const len = Math.ceil(Math.log10(num + 1));
MaxArt
fuente
1
Creo que esta matemática pura es más eficiente / más rápida.
Noitidart
2
Awesme perf man gracias. Los resultados que obtuve muestran que la forma matemática es fastet, ¿es este el resultado que obtuviste? Aquí está mi resultado: i.imgur.com/9BKxyd3.png
Noitidart
1
@HubertGrzeskowiak Oh, eso es bueno. Veo que el método es básicamente matemático de todos modos, pero con algunos trucos de velocidad. Deja caer una Math.ceily usa una más rápida en su Math.abslugar. Pero, sinceramente, no esperaba ese aumento de rendimiento en Chrome ... ¡Es bueno saberlo!
MaxArt
3
Perfecto, pero da 0 si el número es 0 en lugar de 1
StateLess
1
Con 1e + 16 o más, da 1 menos, por lo que 10000000000000000 devuelve 16 en lugar de 17 y así sucesivamente ...
Goty Metal
12

He estado usando esta funcionalidad en node.js, esta es mi implementación más rápida hasta ahora:

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

Debe manejar enteros positivos y negativos (también en forma exponencial) y debe devolver la longitud de la parte entera en flotantes.

La siguiente referencia debe proporcionar una idea del método: Weisstein, Eric W. "Number Length". De MathWorld: un recurso web de Wolfram.

Creo que alguna operación bit a bit puede reemplazar a Math.abs, pero jsperf muestra que Math.abs funciona bien en la mayoría de los motores js.

Actualización : como se señaló en los comentarios, esta solución tiene algunos problemas :(

Actualización 2 (solución alternativa) : creo que en algún momento entran en juego los problemas de precisión y el Math.log(...)*0.434...justo se comporta inesperadamente. Sin embargo, si Internet Explorer o dispositivos móviles no son su taza de té, puede reemplazar esta operación con la Math.log10función. En Node.js escribí una prueba básica rápida con la función nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;y Math.log10funcionó como se esperaba. Tenga en cuenta que Math.log10no es universalmente compatible.

Israfil Havilah
fuente
Como curiosidad, he realizado un JsPerf con el método nLength vs toString (). Longitud en esto ... jsperf.com/convert-number-to-string-and-get-length/2
Israfil Havilah
Jaja, esa es básicamente la solución que proporcioné. No tenía idea de que podría funcionar tan bien.
MaxArt
2
Lo siento, ¿dije algo sobre mí inventando la solución o algo así? ¿Por qué no lees detenidamente antes de publicar? De hecho, el algoritmo se descubrió mucho antes de que Steven Wolfram naciera, y de todos modos la página que vinculaste no proporciona una solución en Javascript. Lo hice, 9 meses antes que tú.
MaxArt
1
El "+1" probablemente debería estar fuera de la llamada Math.abs: Math.log (Math.abs (n) + 1) ...
Hubert Grzeskowiak
1
Con 1e + 16 o más, da 1 menos, por lo que 10000000000000000 devuelve 16 en lugar de 17 y así sucesivamente ...
Goty Metal
11

Tienes que hacer el número para encadenar para tomar longitud

var num = 123;

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

o

alert(num.toString().length);
Adil
fuente
9

También podría usar una cadena de plantilla:

const num = 123456
`${num}`.length // 6
funador
fuente
esta es la única respuesta que me funciona porque cuento un número que comienza con 0.
jessiPP
5

Bueno, sin convertir el entero en una cadena, podrías hacer un bucle funky:

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

alert(length);​

Demostración: http://jsfiddle.net/maniator/G8tQE/

Naftali aka Neal
fuente
3
@Pointy sí, esto supone un número entero. Incluso si lo convierte en una cadena, incluirá el .como parte del cálculo.
Naftali alias Neal
sí, aunque es una pregunta filosófica interesante si el punto debe incluirse en la "longitud" :-)
Pointy
4

Primero conviértalo a una cadena:

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

Agregarle una cadena vacía implícitamente hará mynumberque se convierta en una cadena.

tskuzzy
fuente
1
No funciona con exponenciales como 1e + 16 que devuelve 5.
Goty Metal
4

Hay tres formas de hacerlo.

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

mejor rendimiento uno (mejor rendimiento en ie11)

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

Matemáticas (mejor rendimiento en Chrome, firefox pero el más lento en ie11)

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

hay un jspref aquí http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2

Eric Chen
fuente
4

Debes elegir el más simple (stringLength), la legibilidad siempre supera la velocidad. Pero si te importa la velocidad, aquí hay algunos a continuación.

Tres métodos diferentes, todos con velocidad variable.

// 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);
}
Oliver Dixon
fuente
3

Me hicieron una pregunta similar en una prueba.

Encuentra la longitud de un número sin convertir a cadena

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 ]

Se agregaron números negativos para complicarlo un poco más, de ahí el Math.abs ().

Adrian Lynch
fuente
2

Me gustaría corregir la respuesta @Neal que fue bastante buena para los enteros, pero el número 1 devolvería una longitud de 0 en el caso anterior.

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;
}
Gregzenegair
fuente
0

Sí, necesita convertir a cadena para encontrar la longitud. Por ejemplo

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.
kamal
fuente