Estoy buscando obtener la longitud de un número en JavaScript o jQuery?
Lo he intentado value.length
sin éxito, ¿primero necesito convertir esto en una cadena?
Estoy buscando obtener la longitud de un número en JavaScript o jQuery?
Lo he intentado value.length
sin éxito, ¿primero necesito convertir esto en una cadena?
Respuestas:
var x = 1234567;
x.toString().length;
Este proceso también funcionará por Float Number
y para Exponential number
también.
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. num
se supone que es un número entero no negativo aquí: si es negativo, tome su valor absoluto y ajuste el signo después.
Ahora que Math.log10
es una cosa , simplemente puedes escribir
const len = Math.ceil(Math.log10(num + 1));
Math.ceil
y usa una más rápida en su Math.abs
lugar. Pero, sinceramente, no esperaba ese aumento de rendimiento en Chrome ... ¡Es bueno saberlo!
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.log10
funció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.log10
funcionó como se esperaba. Tenga en cuenta que Math.log10
no es universalmente compatible.
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/
.
como parte del cálculo.
Primero conviértalo a una cadena:
var mynumber = 123;
alert((""+mynumber).length);
Agregarle una cadena vacía implícitamente hará mynumber
que se convierta en una cadena.
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
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);
}
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 ().
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;
}