Obter número de dígitos com JavaScript

124

Como o título da minha postagem sugere, eu gostaria de saber quantos dígitos var numbertem. Por exemplo: Se number = 15;minha função retornar 2. Atualmente, é assim:

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

Mas o Safari diz que não está funcionando devido a TypeError:

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

Como você pode ver, '2'é realmente a solução certa. Mas porque é isso not a function?

bit4fox
fonte

Respostas:

229

lengthé uma propriedade, não um método. Você não pode chamá-lo, portanto, não precisa de parênteses ():

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

ATUALIZAÇÃO: Conforme discutido nos comentários, o exemplo acima não funcionará para números flutuantes. Para torná-lo trabalho que pode se livrar de um período com String(number).replace('.', '').length, ou contar os dígitos com expressão regular: String(number).match(/\d/g).length.

Em termos de velocidade, potencialmente, a maneira mais rápida de obter o número de dígitos no número fornecido é fazê-lo matematicamente. Para números inteiros positivos, existe um algoritmo maravilhoso com log10:

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

Para todos os tipos de números inteiros (incluindo negativos), existe uma solução otimizada brilhante do @ Mwr247 , mas tenha cuidado com o uso Math.log10, pois ele não é suportado por muitos navegadores herdados. Portanto, a substituição Math.log10(x)por Math.log(x) * Math.LOG10Eresolverá o problema de compatibilidade.

Criar soluções matemáticas rápidas para números decimais não será fácil devido ao comportamento bem conhecido da matemática de ponto flutuante ; portanto, a abordagem de conversão por string será mais fácil e à prova de erros. Conforme mencionado pelo @streetlogics, a conversão rápida pode ser feita com concatenação simples de número para string, levando a solução de substituição a ser transformada em:

var length = (number + '').replace('.', '').length;  // for floats
Visão
fonte
3
boa técnica para obter nenhum dos dígitos, mas, o que se é um número fracionário, ou seja, 12,5, então a sua função irá retornar 4 em vez de 3 ...
Swarnendu Paul
@Swarnendu: Isso não é problema, porque eu tenho apenas números inteiros.
Bit4fox
3
Caso contrário, basta usar algo como number.toString().match(/\d/g).length.
VisioN
1
@Bakudan - Esta resposta parece ter sido corrigida. Você pode excluir seus dois comentários criticando-o agora (para que os futuros pessoas não ficar confuso e acho que o código nesta resposta não funciona.)
ArtOfWarfare
1
@ 3ocene Bom palpite! O valor permanece o mesmo, mas nos bastidores é convertido em inteiro. x | 0é apenas outra versão curta e rápida de Math.floor(x), que arredonda o número. Você pode conseguir o mesmo com ~~x. A pergunta a seguir fornece mais explicações sobre o assunto: stackoverflow.com/q/9049677/1249581 .
VisioN
65

Aqui está uma resposta matemática (também funciona para números negativos):

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

E uma versão otimizada do acima (operações bit a bit mais eficientes):

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

Basicamente, começamos obtendo o valor absoluto da entrada para permitir que valores negativos funcionem corretamente. Em seguida, executamos a operação log10 para nos dar a potência de 10 da entrada (se você estivesse trabalhando em outra base, usaria o logaritmo dessa base), que é o número de dígitos. Em seguida, aplicamos o piso à saída para pegar apenas a parte inteira disso. Finalmente, usamos a função max para fixar valores decimais (qualquer valor fracionário entre 0 e 1 retorna apenas 1, em vez de um número negativo) e adicionamos 1 à saída final para obter a contagem.

O exemplo acima pressupõe (com base no seu exemplo de entrada) que você deseja contar o número de dígitos em números inteiros (portanto 12345 = 5 e, portanto, 12345.678 = 5 também). Se você deseja contar o número total de dígitos no valor (portanto 12345.678 = 8), adicione-o antes do 'retorno' em qualquer uma das funções acima:

x = Number(String(x).replace(/[^0-9]/g, ''));
Mwr247
fonte
3
Nota: Math.log10 é a função ES6 developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Tx3
2
@ Tx3 Boa nota! Felizmente, Math.LOG10Eexiste desde o ES1, o que significa Math.log(x) * Math.LOG10Eque funcionará para compatibilidade.
precisa saber é o seguinte
Eu acho que esta função não funciona: `` `function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; Você pode usar o seguinte comando: `` numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov 12/19/19

@lokhmakov Isso ocorre porque o segundo número que você forneceu excede o valor inteiro máximo de 32 bits do JavaScript, que os operadores bit a bit (^, >>, |) não conseguem manipular corretamente.
Mwr247

1
Verdade. É de se esperar que o JS funcione apenas com o max safe int, e esse número é muito maior do que quase todo mundo precisaria para qualquer coisa. Estou desenvolvendo um jogo com números muito grandes e não pude usar o código otimizado por causa dessa limitação, e achei que gostaria de comentar para salvar qualquer pessoa em um barco semelhante de ter quebrado o código posteriormente. Ótima resposta por sinal.
Justin

20

Como isso surgiu em uma pesquisa no Google por "javascript obtém o número de dígitos", eu queria divulgar que existe uma alternativa mais curta para isso, que depende da transmissão interna a ser feita para você:

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);

Rendimentos

3 4

4
E uma rápida mostra JSPerf que este é muito mais rápido também (como, 10x ou mais): jsperf.com/number-tostring-vs-number
Ledivin

NOTA! Conta o ponto como um número também. (em dec_number)
Sebastian Norr 14/11/19

2

Se você precisar de dígitos (após o separador), basta dividir o número e contar o comprimento na segunda parte (após o ponto).

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

Ainda estou aprendendo Javascript, mas criei essa função em C há algum tempo atrás, que usa matemática e um loop while em vez de uma string, então reescrevi para Javascript. Talvez isso possa ser feito de forma recursiva de alguma forma, mas ainda não compreendi o conceito :( É o melhor que pude sugerir. Não sei ao certo qual número de números ele funciona, funcionou quando coloquei centenas dígitos.

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

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

editar: só funciona com valores inteiros


1

Nota: Esta função ignorará os números após o ponto médio decimal . Se você quiser contar com decimal, remova o Math.floor(). Direto ao ponto, verifique isso!

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))

Basicamente, o que está acontecendo aqui. toString()e a String()mesma função incorporada para converter dígito em sequência, uma vez convertidos, encontraremos o comprimento da sequência por função incorporada length.

Alerta: Mas esta função não funcionaria corretamente para número negativo, se você estiver tentando jogar com número negativo, verifique esta resposta Ou simplesmente coloque Math.abs()-a;

Animar você!


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

Dois dígitos: função simples, caso você precise de dois ou mais dígitos de um número com o ECMAScript 6 (ES6):

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

0

Declaração do problema: Conte o número / string que não usa string.length () jsfunction. Solução: poderíamos fazer isso através do Forloop. por exemplo

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

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

else{
  this.number = this.y;
}    

}

Yogesh Aggarwal
2
Isso não responde à pergunta
Steve Taylor
0

Aqui está a minha solução. Funciona com números positivos e negativos. Espero que isto ajude

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4
Juliana Melo
fonte
0

seria simples obter o comprimento como

  `${NUM}`.length

onde NUM é o número para obter o comprimento para

AP
fonte
0

Você pode usar neste truque

(''+number).length

Idan
fonte
0

Por favor, use a seguinte expressão para obter o comprimento do número.

length = variableName.toString().length
Priya Shalini
fonte
-7

A propriedade length retorna o comprimento de uma sequência (número de caracteres).

O comprimento de uma cadeia vazia é 0.

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

O resultado de n será: 12

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

O resultado de n será: 0


Propriedade comprimento da matriz:


A propriedade length define ou retorna o número de elementos em uma matriz.

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

O resultado será: 4

Sintaxe:

Retorne o comprimento de uma matriz:

array.length

Defina o comprimento de uma matriz:

array.length=number
Muhammad Awais
fonte
2
Isso não responde à pergunta
Steve Taylor