Pregunta Obtenga el número de dígitos con JavaScript


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

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

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

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

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


74
2018-02-14 16:39


origen


Respuestas:


length es una propiedad, no un método. No puedes llamarlo, por lo tanto no necesitas paréntesis ():

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

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

En términos de velocidad, la forma más rápida de obtener el número de dígitos en un número dado es hacerlo matemáticamente. por enteros positivos hay un maravilloso algoritmo 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 ten cuidado con el uso Math.log10, ya que no es compatible con muchos navegadores heredados. Entonces reemplazando Math.log10(x) con Math.log(x) * Math.LOG10E resolverá el problema de compatibilidad.

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

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

143
2018-02-14 16:39



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 a nivel de 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 estuvieras trabajando en otra base, usarías el logaritmo para esa base), que es el número de dígitos. Luego plantamos la salida para que solo capte la parte entera de eso. Finalmente, usamos la función max para arreglar los valores decimales (cualquier valor fraccionario entre 0 y 1 simplemente devuelve 1, en lugar de un número negativo), y agregamos 1 a la salida final para obtener el conteo.

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

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

41
2018-01-28 22:14



Como 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 depende de la conversión interna que se hará por 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

15
2018-05-01 21:17



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

function countDigits(number) {
    var sp = (number + '').split('.');
    if (sp[1] !== undefined) {
        return sp[1].length;
    } else {
        return 0;
    }
}

2
2017-10-12 07:59



Todavía estoy aprendiendo Javascript, pero se me ocurrió esta función en C hace un rato, que utiliza matemáticas y un ciclo while en lugar de una cadena, así que lo reescribí para Javascript. Tal vez esto podría hacerse de manera recursiva de alguna manera, pero todavía no he captado el concepto :( Esto es lo mejor que se me ocurrió. No estoy seguro de la cantidad de números con los que 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
2017-11-04 17:35



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
2018-05-22 12:01



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
2018-06-05 10:17



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


Propiedad de longitud de matriz:


La propiedad de longitud establece o devuelve la cantidad 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

-4
2018-06-02 06:23