Obtenga el número de dígitos con JavaScript


124

Como sugiere el título de mi publicación, me gustaría saber cuántos dígitos var numbertiene. Por ejemplo: si number = 15;mi función debe regresar 2. Actualmente, se ve así:

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

Pero Safari dice que no está funcionando debido a TypeError:

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

Como puede ver, en '2'realidad es la solución correcta. ¿Pero por qué lo es not a function?

Respuestas:


229

lengthes una propiedad, no un método No puede llamarlo, por lo tanto, no necesita paréntesis ():

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

ACTUALIZACIÓN: Como se discutió en los comentarios, el ejemplo anterior no funcionará para números flotantes. Para hacer que funcione bien nos podemos deshacernos de un período con String(number).replace('.', '').length, o contar con los dígitos expresión regular: String(number).match(/\d/g).length.

En términos de velocidad, potencialmente la forma más rápida de obtener el número de dígitos en el número dado es hacerlo matemáticamente. Para enteros positivos hay un algoritmo maravilloso con log10:

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

Para todos los tipos de enteros (incluidos los negativos) hay una solución optimizada brillante de @ Mwr247 , pero tenga cuidado con el uso Math.log10, ya que no es compatible con muchos navegadores heredados. Por lo tanto, reemplazar Math.log10(x)con Math.log(x) * Math.LOG10Eresolverá el problema de compatibilidad.

Crear soluciones matemáticas rápidas para números decimales no será fácil debido al comportamiento bien conocido de las matemáticas de coma flotante , por lo que el enfoque de conversión a cuerda será más fácil y a prueba de tontos. Como se menciona en @streetlogics, la conversión rápida se puede hacer con una simple concatenación de números a cadenas, lo que lleva a que la solución de reemplazo se transforme en:

var length = (number + '').replace('.', '').length;  // for floats

3
buena técnica para conseguir ninguna de dígitos, pero, ¿y si se trata de un número de fracción, es decir, 12.5, entonces su función devolverá 4 en vez de 3 ...
Swarnendu Paul

@Swarnendu: Eso no es problema porque solo tengo enteros.
bit4fox

3
De lo contrario, solo usa algo como number.toString().match(/\d/g).length.
VisioN

1
@Bakudan: esta respuesta parece haberse solucionado. Puede eliminar sus dos comentarios que lo critican ahora (para que las personas futuras no se confundan y piensen que el código de esta respuesta no funciona)
ArtOfWarfare

1
@ 3ocene ¡Buena suposición! El valor permanece igual pero detrás de escena se convierte en entero. x | 0es solo otra versión corta y rápida de Math.floor(x), que redondea el número. Puedes lograr lo mismo con ~~x. La siguiente pregunta proporciona más explicaciones sobre el punto: stackoverflow.com/q/9049677/1249581 .
VisioN

66

Aquí hay una respuesta matemática (también funciona para números negativos):

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

Y una versión optimizada de lo anterior (operaciones bit a bit más eficientes):

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

Esencialmente, comenzamos obteniendo el valor absoluto de la entrada para permitir que los valores negativos funcionen correctamente. Luego ejecutamos a través de la operación log10 para darnos qué potencia de 10 es la entrada (si estuviera trabajando en otra base, usaría el logaritmo para esa base), que es el número de dígitos. Luego colocamos el resultado en el piso para tomar solo la parte entera de eso. Finalmente, usamos la función max para fijar los valores decimales (cualquier valor fraccionario entre 0 y 1 solo devuelve 1, en lugar de un número negativo), y agregamos 1 a la salida final para obtener el recuento.

Lo anterior supone (según su entrada de ejemplo) que desea contar el número de dígitos en enteros (por lo tanto, 12345 = 5 y, por lo tanto, 12345.678 = 5 también). Si desea contar el número total de dígitos en el valor (por lo tanto, 12345.678 = 8), agregue esto antes del 'retorno' en cualquiera de las funciones anteriores:

x = Number(String(x).replace(/[^0-9]/g, ''));


2
@ Tx3 ¡Buena nota! Afortunadamente, Math.LOG10Eha existido desde ES1, lo que significa Math.log(x) * Math.LOG10Eque funcionará por compatibilidad.
Mwr247

Creo que esta función no funciona: `` `function numDigits (x) {return (Math.log10 ((x ^ (x >> 31)) - (x >> 31)) | 0) + 1; } `` `numDigits (1234567891) -> 10 numDigits (12345678912) -> 9
lokhmakov

@lokhmakov Eso se debe a que el segundo número que proporcionó excede el valor entero máximo de 32 bits de JavaScript, que los operadores bit a bit (^, >>, |) no pueden manejar correctamente.
Mwr247

1
Cierto. Uno debería esperar que JS solo funcione con max safe int, y ese número es mucho mayor de lo que casi cualquier persona necesitaría para algo. Estoy desarrollando un juego con números muy grandes y no pude usar el código optimizado debido a esa limitación, y pensé en comentar para salvar a cualquier otra persona en un barco similar de tener un código roto más adelante. Gran respuesta por cierto.
Justin

20

Dado que esto surgió en una búsqueda en Google de "javascript get number of digits", quería decir que hay una alternativa más corta a esto que se basa en la conversión interna que se debe hacer para usted:

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

Rendimientos

3 4

44
Y un jsperf rápido muestra que esto también es MUCHO más rápido (como en 10x o más): jsperf.com/number-tostring-vs-number
Ledivin

¡NOTA! Cuenta el punto como un número también. (en dec_number)
Sebastian Norr

2

Si necesita dígitos (después del separador), simplemente puede dividir el número y contar la longitud de la segunda parte (después del punto).

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

Todavía estoy aprendiendo Javascript, pero se me ocurrió esta función en C hace un tiempo, que usa matemáticas y un ciclo while en lugar de una cadena, así que la reescribí para Javascript. Tal vez esto podría hacerse recursivamente de alguna manera, pero todavía no he entendido realmente el concepto :( Esto es lo mejor que se me ocurrió. No estoy seguro de con cuántos números funciona, funcionó cuando puse cien dígitos

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

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

editar: solo funciona con valores enteros


1

Nota: Esta función ignorar los números después de la media decimal de puntos , si quieres contar con decimales a continuación, quitar el Math.floor(). Directo al punto, ¡mira esto!

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

Básicamente lo que está pasando aquí. toString()y la String()misma función incorporada para convertir dígitos en cadena, una vez que hayamos convertido, encontraremos la longitud de la cadena por función incorporadalength .

Alerta: Pero esta función no funcionaría correctamente para un número negativo, si intentas jugar con un número negativo, verifica esta respuesta o simplemente ponla Math.abs();

¡Animarte!


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

Dos dígitos: función simple en caso de que necesite dos o más dígitos de un número con ECMAScript 6 (ES6):

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

0

Declaración del problema: Cuente el número / cadena que no utiliza string.length () jsfunction. Solución: podríamos hacer esto a través de Forloop. p.ej

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

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

else{
  this.number = this.y;
}    

}


0

Aquí está mi solución. Funciona con números positivos y negativos. Espero que esto ayude

function findDigitAmount(num) {

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

 return lengthNumber.length;
}


(findDigitAmount(-96456431);    // 8
(findDigitAmount(1524):         // 4

0

sería simple obtener la longitud como

  `${NUM}`.length

donde NUM es el número para obtener la longitud de


0

Puedes usar en este truco

(''+number).length


0

Utilice la siguiente expresión para obtener la longitud del número.

length = variableName.toString().length

-7

La propiedad de longitud devuelve la longitud de una cadena (número de caracteres).

La longitud de una cadena vacía es 0.

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

El resultado de n será: 12

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

El resultado de n será: 0


Longitud de la matriz Propiedad:


La propiedad de longitud establece o devuelve el número de elementos en una matriz.

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

El resultado será: 4

Sintaxis:

Devuelve la longitud de una matriz:

array.length

Establecer la longitud de una matriz:

array.length=number

2
Esto no responde a la pregunta
Steve Taylor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.