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
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP