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?
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
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){returnMath.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:
@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.
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.
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ê:
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.
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 ){returnMath.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;
`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));
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
number.toString().match(/\d/g).length
.x | 0
é apenas outra versão curta e rápida deMath.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 .Aqui está uma resposta matemática (também funciona para números negativos):
E uma versão otimizada do acima (operações bit a bit mais eficientes):
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:
fonte
Math.LOG10E
existe desde o ES1, o que significaMath.log(x) * Math.LOG10E
que funcionará para compatibilidade.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ê:
Rendimentos
fonte
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).
fonte
fonte
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.
editar: só funciona com valores inteiros
fonte
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!// ES5 +
Basicamente, o que está acontecendo aqui.
toString()
e aString()
mesma função incorporada para converter dígito em sequência, uma vez convertidos, encontraremos o comprimento da sequência por função incorporadalength
.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ê!
fonte
fonte
Dois dígitos: função simples, caso você precise de dois ou mais dígitos de um número com o ECMAScript 6 (ES6):
fonte
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
}
Aqui está a minha solução. Funciona com números positivos e negativos. Espero que isto ajude
fonte
seria simples obter o comprimento como
onde NUM é o número para obter o comprimento para
fonte
Você pode usar neste truque
(''+number).length
fonte
Por favor, use a seguinte expressão para obter o comprimento do número.
fonte
A propriedade length retorna o comprimento de uma sequência (número de caracteres).
O comprimento de uma cadeia vazia é 0.
O resultado de n será: 12
O resultado de n será: 0
A propriedade length define ou retorna o número de elementos em uma matriz.
O resultado será: 4
Sintaxe:
Retorne o comprimento de uma matriz:
Defina o comprimento de uma matriz:
fonte