¿Cuál es la forma recomendada de rellenar un valor en JavaScript? Me imagino que podría construir una función personalizada para rellenar ceros en un valor de tipografía, pero me pregunto si hay una forma más directa de hacerlo.
Nota: Por "rellenado con ceros" quiero decir en el sentido de la base de datos de la palabra (donde una representación de rellenado con ceros de 6 dígitos del número 5 sería "000005").
javascript
zerofill
Wilco
fuente
fuente
npm install sprintf-js
sprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... suponiendo quen
no sea negativowhile
para poder accedern.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Respuestas:
Una función simple es todo lo que necesitas
podría incluir esto en una biblioteca si desea conservar el espacio de nombres o lo que sea. Al igual que con jQuery's extend .
fuente
Manera simple. Puede agregar multiplicación de cuerdas para el pad y convertirlo en una función.
Como una función,
fuente
paddy (888, 2)
rendimientos88
y no888
como se requiere. Esta respuesta tampoco maneja números negativos.No puedo creer todas las respuestas complejas aquí ... Solo usa esto:
fuente
De hecho, tuve que pensar en algo como esto recientemente. Supuse que tenía que haber una manera de hacerlo sin usar bucles.
Esto es lo que se me ocurrió.
Luego, solo úselo proporcionando un número a cero pad:
Si el número es mayor que el relleno, el número se expandirá más allá del relleno:
¡Los decimales también están bien!
Si no le importa contaminar el espacio de nombres global, puede agregarlo directamente a Number:
Y si prefiere que los decimales ocupen espacio en el relleno:
¡Salud!
A XDR se le ocurrió una variación logarítmica que parece funcionar mejor.
ADVERTENCIA : esta función falla si num es igual a cero (por ejemplo, zeropad (0, 2))
Hablando de rendimiento, tomsmeding comparó las 3 respuestas principales ( 4 con la variación del registro ). Adivinar cuál mayormente superaron a los otros dos? :)
fuente
numZeros
parámetro, ya que es engañoso. No es el número de ceros que desea agregar, es la longitud mínima que debe ser el número. Un mejor nombre seríanumLength
o inclusolength
.num
puede ser cero ...Esto es lo que solía rellenar un número de hasta 7 caracteres.
Este enfoque probablemente será suficiente para la mayoría de las personas.
Editar: si desea hacerlo más genérico, puede hacer esto:
Edición 2: Tenga en cuenta que desde ES2017 puede usar
String.prototype.padStart
:fuente
number = 123456789
, con el código anterior, por ejemplo.new String
. Simplemente puede usar cadenas literales.(new Array(padding + 1).join("0")
puede ser reemplazado con"0".repeat(padding)
Los navegadores modernos ahora son compatibles
padStart
, simplemente puede hacer ahora:Ejemplo:
fuente
Desafortunadamente, hay muchas sugerencias complicadas innecesarias para este problema, que generalmente implican escribir su propia función para hacer operaciones matemáticas o manipulación de cadenas o llamar a una utilidad de terceros. Sin embargo, hay una forma estándar de hacerlo en la biblioteca JavaScript base con solo una línea de código. Puede valer la pena incluir esta línea de código en una función para evitar tener que especificar parámetros que nunca desee cambiar, como el nombre o el estilo local.
Esto producirá el valor de "005" para el texto. También puede usar la función toLocaleString de Number para rellenar ceros al lado derecho del punto decimal.
Esto producirá el valor de "5.00" para el texto. Cambie useGrouping a true para usar separadores de coma para miles.
Tenga en cuenta que el uso
toLocaleString()
conlocales
yoptions
argumentos está estandarizado por separado en ECMA-402 , no en ECMAScript. A partir de hoy, algunos navegadores solo implementan soporte básico , es decir,toLocaleString()
pueden ignorar cualquier argumento.Ejemplo completo
fuente
Si se sabe de antemano que el número de relleno no excede un cierto valor, hay otra forma de hacerlo sin bucles:
Casos de prueba aquí: http://jsfiddle.net/jfriend00/N87mZ/
fuente
-88
debería ceder"-00088"
, por ejemplo.zeroFill(-88, 5)
deberían producir-00088
o no-0088
. Supongo que depende de si quieres que elwidth
argumento sea todo el ancho del número o solo el número de dígitos (sin incluir el signo negativo). Un implementador puede cambiar fácilmente el comportamiento para no incluir el signo negativo simplemente quitando la--width
línea de código.La manera rápida y sucia:
Para x = 5 y cuenta = 6 tendrás y = "000005"
fuente
y="0005"
con lo anterior,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
es lo que me dioy="000005"
('0000'+n).slice(-4)
Aquí hay una función rápida que se me ocurrió para hacer el trabajo. Si alguien tiene un enfoque más simple, ¡siéntase libre de compartir!
fuente
for
.vs.while
el rendimiento no es lo suficientemente diferente como para ser interesante: jsperf.com/fors-vs-while/34Tarde para la fiesta aquí, pero a menudo uso esta construcción para hacer un relleno ad-hoc de algún valor
n
, que se sabe que es un decimal positivo:Donde
offset
tiene 10 ^^ dígitos.Por ejemplo, Relleno a 5 dígitos, donde n = 123:
La versión hexadecimal de esto es un poco más detallada:
Nota 1: También me gusta la solución de @ profitehlolz, que es la versión en cadena de esta, usando la ingeniosa característica de índice negativo de slice ().
fuente
Realmente no sé por qué, pero nadie lo hizo de la manera más obvia. Aquí está mi implementación.
Función:
Prototipo:
Muy sencillo, no puedo ver de ninguna manera cómo esto puede ser más simple. Por alguna razón, he parecido muchas veces aquí en SO, la gente simplemente trata de evitar los bucles 'for' y 'while' a cualquier costo. El uso de expresiones regulares probablemente costará muchos más ciclos para un relleno tan trivial de 8 dígitos.
fuente
Yo uso este fragmento para obtener una representación de 5 dígitos
fuente
ECMAScript 2017: use padStart o padEnd
Más información:
fuente
El poder de las matemáticas!
x = entero para rellenar
y = número de ceros para rellenar
fuente
No vi a nadie señalar el hecho de que cuando usas String.prototype.substr () con un número negativo, cuenta desde la derecha.
Una solución única a la pregunta del OP, una representación de 6 dígitos rellenada con cero del número 5, es:
Generalizando obtendremos:
fuente
Después de mucho, mucho tiempo de probar 15 funciones / métodos diferentes que se encuentran en las respuestas a estas preguntas, ahora sé cuál es el mejor (el más versátil y el más rápido).
Tomé 15 funciones / métodos de las respuestas a esta pregunta e hice un script para medir el tiempo necesario para ejecutar 100 pads. Cada pad rellenaría el número
9
con2000
ceros. Esto puede parecer excesivo, y lo es, pero le da una buena idea sobre la escala de las funciones.El código que utilicé se puede encontrar aquí: https://gist.github.com/NextToNothing/6325915
Siéntase libre de modificar y probar el código usted mismo.
Para obtener el método más versátil, debe usar un bucle. Esto se debe a que con números muy grandes es probable que otros fallen, mientras que esto tendrá éxito.
Entonces, ¿qué bucle usar? Bueno, eso sería un
while
bucle. Unfor
bucle sigue siendo rápido, pero unwhile
bucle es solo un poco más rápido (un par de ms) y más limpio.Respuestas como esas por
Wilco
,Aleksandar Toplek
oVitim.us
harán el trabajo perfectamente.Personalmente, probé un enfoque diferente. Intenté usar una función recursiva para rellenar la cadena / número. Funcionó mejor que los métodos que se unen a una matriz pero, aún así, no funcionó tan rápido como un bucle for.
Mi funcion es:
Puede usar mi función con o sin establecer la variable de relleno. Así como esto:
Personalmente, después de mis pruebas, usaría un método con un ciclo while, como
Aleksandar Toplek
oVitim.us
. Sin embargo, lo modificaría ligeramente para que pueda establecer la cadena de relleno.Entonces, usaría este código:
También puede usarlo como una función prototipo, usando este código:
fuente
El primer parámetro es cualquier número real, el segundo parámetro es un número entero positivo que especifica el número mínimo de dígitos a la izquierda del punto decimal y el tercer parámetro es un número entero positivo opcional que especifica el número si los dígitos están a la derecha del punto decimal.
entonces
fuente
No reinvente la rueda, use una cadena de subrayado :
jsFiddle
fuente
Esta es la solución ES6.
fuente
const numStr = String(num)
yreturn '0'.repeat(len - numStr.length) + numStr;
En todos los navegadores modernos puedes usar
Aquí está la referencia de MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
fuente
No es que esta pregunta necesite más respuestas, pero pensé que agregaría la versión simple de esto.
_.padLeft(number, 6, '0')
fuente
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
y luegoimport padLeft from 'lodash.padleft'
omitir el_.
La última forma de hacer esto es mucho más simple:
output: "02"
fuente
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
devuelve"00.008"
para mí, según mi ubicación.Solo otra solución, pero creo que es más legible.
fuente
Este es menos nativo, pero puede ser el más rápido ...
fuente
pad = count - (num + '').length
. los números negativos no se manejan bien, pero aparte de eso, no está mal. +1Mi solución
Uso
fuente
¿Por qué no usar la recursividad?
fuente
Algunos parches de mono también funcionan
fuente
pad(5, 0, 6)
=000005
pad('10', 0, 2)
=10 // don't pad if not necessary
pad('S', 'O', 2)
=SO
... etc.
Salud
fuente
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
si lo arreglas, eliminaré mi voto negativo.0
combinación codificada char :): Respuesta actualizada.El más simple , la solución más directo que encontrará.
fuente