Estou procurando obter o tamanho de um número em JavaScript ou jQuery?
Tentei value.length
sem sucesso. Preciso converter isso em uma string primeiro?
Estou procurando obter o tamanho de um número em JavaScript ou jQuery?
Tentei value.length
sem sucesso. Preciso converter isso em uma string primeiro?
Respostas:
var x = 1234567;
x.toString().length;
Este processo também funcionará para Float Number
e para Exponential number
também.
Ok, muitas respostas, mas essa é pura matemática, apenas por diversão ou por lembrar que a matemática é importante:
var len = Math.ceil(Math.log(num + 1) / Math.LN10);
Na verdade, isso fornece o "comprimento" do número, mesmo que esteja na forma exponencial. num
deve ser um número inteiro não negativo aqui: se for negativo, pegue seu valor absoluto e ajuste o sinal posteriormente.
Agora isso Math.log10
é uma coisa , você pode simplesmente escrever
const len = Math.ceil(Math.log10(num + 1));
Math.ceil
e usa um mais rápido Math.abs
. Mas sinceramente não esperava esse ganho de desempenho no Chrome ... É bom saber!
Eu tenho usado essa funcionalidade no node.js, esta é a minha implementação mais rápida até agora:
var nLength = function(n) {
return (Math.log(Math.abs(n)+1) * 0.43429448190325176 | 0) + 1;
}
Ele deve manipular números inteiros positivos e negativos (também na forma exponencial) e deve retornar o comprimento da parte inteira em números flutuantes.
A referência a seguir deve fornecer algumas dicas sobre o método: Weisstein, Eric W. "Number Length". De MathWorld - um recurso da Web da Wolfram.
Acredito que alguma operação bit a bit possa substituir o Math.abs, mas o jsperf mostra que o Math.abs funciona bem na maioria dos mecanismos js.
Atualização : conforme observado nos comentários, esta solução tem alguns problemas :(
Atualização2 (solução alternativa) : acredito que, em algum momento, surjam problemas de precisão e os que Math.log(...)*0.434...
se comportam inesperadamente. No entanto, se os dispositivos Internet Explorer ou Mobile não forem sua xícara de chá, você poderá substituir esta operação pela Math.log10
função No Node.js, escrevi um teste básico rápido com a função nLength = (n) => 1 + Math.log10(Math.abs(n) + 1) | 0;
e com Math.log10
ela funcionou conforme o esperado. Observe que Math.log10
não é universalmente suportado.
Bem, sem converter o número inteiro em uma string, você pode criar um loop funky:
var number = 20000;
var length = 0;
for(i = number; i > 1; ++i){
++length;
i = Math.floor(i/10);
}
alert(length);
Demonstração: http://jsfiddle.net/maniator/G8tQE/
.
como parte do cálculo.
Primeiro converta-o em uma string:
var mynumber = 123;
alert((""+mynumber).length);
Adicionar uma string vazia a ela implicitamente fará mynumber
com que ela se transforme em uma string.
Existem três maneiras de fazer isso.
var num = 123;
alert(num.toString().length);
melhor desempenho um (melhor desempenho no ie11)
var num = 123;
alert((num + '').length);
Math (melhor desempenho no Chrome, Firefox, mas o mais lento no ie11)
var num = 123
alert(Math.floor( Math.log(num) / Math.LN10 ) + 1)
existe um jspref aqui http://jsperf.com/fastest-way-to-get-the-first-in-a-number/2
Você deve optar pelo mais simples (stringLength), a legibilidade sempre supera a velocidade. Mas se você se preocupa com velocidade, aqui estão alguns abaixo.
Três métodos diferentes, todos com velocidade variável.
// 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);
}
Fiz uma pergunta semelhante em um teste.
Encontre o comprimento de um número sem converter em string
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 ]
Números negativos foram adicionados para complicar um pouco mais, daí o Math.abs ().
Gostaria de corrigir a resposta do @Neal, que era bastante boa para números inteiros, mas o número 1 retornaria um comprimento de 0 no 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;
}