TransWikia.com

¿Cómo puedo añadir ceros a la izquierda de un entero?

Stack Overflow en español Asked by Yasiel Hernández on January 18, 2021

Yo recibo un número entero, por ejemplo el 3, y quiero mostrar una cadena como por ejemplo “0000003” (seis “0” y el “3”). O recibir el 1050 y mostrar “0001050” (tres “0” y el numero).

Por tanto, lo que quiero es mostrar un entero de 7 dígitos al cual sumarle un número, mostrando los 0 restantes.

var numero = 3;
var cadenaNumerica = 0000000;
var resultado = numero + cadenaNumerica;
//Lo que necesito que devuelva resultado 0000003

3 Answers

ECMA Script 2017 incluye -finalmente- una función para hacerlo: padStart()

La sintaxis es:

str.padStart(tamaño [, cadena_con_la_que_hacer_padding])

Donde:

  • tamaño es el tamaño de la cadena resultante.
  • cadena_con_la_que_hacer_padding es " " (un espacio) por defecto.

Por tanto, harías algo así como:

var numero = '3';
resultado = numero.padStart(7, "0");
console.log(resultado);

Correct answer by fedorqui 'SO deja de dañar' on January 18, 2021

Se rellena números a la derecha mediante un logaritmo y con expresiones regulares, pasan inmediatamente a la izquierda y se elimina el punto.

Primero rellena los ceros restantes hacia la derecha, que es la cantidad de dígitos restado el logaritmo en base 10 del número.

Luego con la expresión regular se separa en dos partes, el número y la cantidad de ceros a la derecha, y se cambia el orden.

var número = 1050
var dígitos = 7
var ceros_izq = (n,d)=>(n.toFixed(d-Math.log10(n))+"").replace(/(d+).(d+)/gi,"$2$1")
document.body.innerHTML = ceros_izq(número,dígitos)

Otra manera más simple es sumarle al número, 10 elevado a la cantidad de dígitos, luego transformarlo en un string y eliminar el primer caracter.

Ejemplo:

      1050
+ 10000000
----------
  10001050
   0001050

var número = 1050
var dígitos = 7
var ceros_izq=(n,d)=>{var e=10**d;return n<e?((n+e)+"").slice(1):n+""}
document.body.innerHTML = ceros_izq(número,dígitos)

Answered by Eslacuare on January 18, 2021

Javascript no dispone de una función que realice el trabajo (como un sprintf de C).

Lo que necesitas en su lugar es agregar los ceros al principio (como cadena) y agregar a ésta el número en la parte final. Por último te quedas únicamente con la parte derecha del resultado (en el caso de que sean números enteros).

Aquí tienes un ejemplo:

/* Número requerido */
var numero = 3;
/* Los ceros los almacenamos como cadena, no como número */
var cadenaNumerica = '0000000';
/* Esto concatenará cadenas, convirtiendo "numero" en una */
var resultado = cadenaNumerica + numero;
/* Nos quedamos con la parte final (con la misma longitud que los 0 iniciales) */
resultado = resultado.substring(resultado.length - cadenaNumerica.length);
/* Mostramos el resultado */
console.log(resultado);


Gracias a la respuesta de @fedorqui conozco la propuesta de ECMA Script 2017 para String.prototype.padStart.

El problema es que actualmente sólo está soportado por las últimas versiones de algunos navegadores, por lo que se me ocurre que podrías comprobar la existencia de la implementación y en caso de no estar disponible crear una versión "light" que emule su comportamiento básico:

/* ¿Este navegador implementa "padStart"? */
if (typeof String.prototype.padStart !== 'function') {
  console.log('Creando una versión de padStart compatible');
  String.prototype.padStart = function(huecos, relleno) {
    /* Obtenemos el valor de la cadena actual */
    let cadena = this.valueOf();
    /* Si la cadena es más grande que el número de huecos
         requerido la devolvemos tal cual */
    if (cadena.length >= huecos) {
      return cadena;
    }
    /* Repetimos el relleno tantos huecos como sea necesario y agregamos el número */
    cadena = Array(huecos).join(relleno) + cadena;
    /* Devolvemos los últimos "huecos" caracteres */
    return cadena.substring(cadena.length - huecos);
  }
} else {
  console.log('Usando la versión de padStart del navegador');
}
/* Hacemos una batería de pruebas con diversos números */
let numeros = [ 3, 1050, 0, 14324, 12345678 ];
for (i in numeros) {
  /* Con "String(m)" convertimos un número en cadena */
  console.log(String(numeros[i]).padStart(7, '0'));
}

PD: No hago uso de la implementación de referencia porque se apoya en String.prototype.repeat que tampoco está soportado en todos los navegadores.

Answered by OscarGarcia on January 18, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP