Necesito una función de JavaScript que pueda tomar un valor y rellenarlo a una longitud determinada (necesito espacios, pero cualquier cosa funcionaría). Encontré esto:
Código:
String.prototype.pad = function(l, s, t){
return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
+ 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
+ this + s.substr(0, l - t) : this;
};
Ejemplo:
<script type="text/javascript">
//<![CDATA[
var s = "Jonas";
document.write(
'<h2>S = '.bold(), s, "</h2>",
'S.pad(20, "[]", 0) = '.bold(), s.pad(20, "[]", 0), "<br />",
'S.pad(20, "[====]", 1) = '.bold(), s.pad(20, "[====]", 1), "<br />",
'S.pad(20, "~", 2) = '.bold(), s.pad(20, "~", 2)
);
//]]>
</script>
Pero no tengo idea de qué diablos está haciendo y no parece funcionar para mí.
javascript
string
Anthony Potts
fuente
fuente
Respuestas:
Encontré esta solución aquí y esto es mucho más simple para mí:
Y aquí hice una extensión para el objeto de cadena:
Un ejemplo para usarlo:
Esto devolverá una hora en el formato "15:30"
fuente
String
bibliotecas JSString.padStart()
yString.padEnd()
para el relleno izquierdo / derecho.Un metodo mas rapido
Si está haciendo esto repetidamente, por ejemplo, para rellenar valores en una matriz, y el rendimiento es un factor, el siguiente enfoque puede brindarle una ventaja de casi 100 veces en velocidad ( jsPerf ) sobre otra solución que se discute actualmente en Internet. La idea básica es que está proporcionando a la función de relleno una cadena vacía completamente rellenada para usar como búfer. La función de almohadilla simplemente agrega una cadena para agregarla a esta cadena precompletada (una cadena concat) y luego corta o recorta el resultado a la longitud deseada.
Por ejemplo, para poner a cero un número con una longitud de 10 dígitos,
Para rellenar una cadena con espacios en blanco, de modo que la cadena completa tenga 255 caracteres,
Prueba de rendimiento
Vea la prueba jsPerf aquí .
Y esto es más rápido que ES6
string.repeat
en 2x también, como lo muestra el JsPerf revisado aquífuente
string.repeat
método ES6 . Entonces, si está haciendo mucho relleno de cuerdas, definitivamente intente esto.http://www.webtoolkit.info/javascript_pad.html
Es mucho más legible.
fuente
pad("hello", 20) = "hello "
Aquí hay un enfoque recursivo.
Un ejemplo...
fuente
String.prototype.padStart()
yString.prototype.padEnd()
actualmente son propuestas de candidatos TC39: consulte github.com/tc39/proposal-string-pad-start-end (solo disponible en Firefox a partir de abril de 2016; hay un polyfill disponible).fuente
myString.padStart(padLength [, padString])
ymyString.padEnd(padLength [, padString])
ECMAScript 2017 agrega un método padStart al prototipo String. Este método rellenará una cadena con espacios a una longitud determinada. Este método también toma una cadena opcional que se usará en lugar de espacios para el relleno.
También se agregó un método padEnd que funciona de la misma manera.
Para la compatibilidad del navegador (y un útil polyfill) vea este enlace .
fuente
Usando el método ECMAScript 6 String # repeat , una función de pad es tan simple como:
String#repeat
actualmente solo es compatible con Firefox y Chrome. para otra implementación, uno podría considerar el siguiente polyfill simple:fuente
Usando el método ECMAScript 6 String # repeat y las funciones de flecha , una función de pad es tan simple como:
jsfiddle
editar: sugerencia de los comentarios:
de esta manera, no arrojará un error cuando
s.length
sea mayor quen
edit2: sugerencia de los comentarios:
de esta manera, puede usar la función para cadenas y no cadenas por igual.
fuente
s.length
es mayor den
lo que arrojará. Sugerir:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
leftPad(12, ' ', 5)
. Si bien sé estrictamente que podría estar bien, probablemente sea uno de los casos de uso más comunes (números de relleno). Tal vezfunction leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }
. El uso de losfunction
medios leftPad puede estar al final del archivo. De lo contrario, posiblemente debas usarconst
novar
nilet
.len
?len
debería sern
El truco clave en ambas soluciones es crear una
array
instancia con un tamaño determinado (uno más que la longitud deseada), y luego llamar inmediatamente aljoin()
método para hacer unstring
. Eljoin()
método se pasa el rellenostring
(espacios probablemente). Comoarray
está vacío, las celdas vacías se procesarán como vacíasstrings
durante el proceso de unir elarray
resultado en un solo resultadostring
, y solo quedará el relleno. Es una muy buena técnica.fuente
pad con valores predeterminados
Me di cuenta de que principalmente necesito el padLeft para la conversión de tiempo / relleno de números
así que escribí esta función
Esta función simple admite Número o Cadena como entrada
el pad predeterminado es de 2 caracteres
char predeterminado es 0
así que simplemente puedo escribir
si agrego el segundo argumento (ancho del pad)
tercer parámetro (pad char)
EDITAR @BananaAcid Si pasa un valor indefinido o una cadena de longitud 0 se obtiene
0undefined
.so:como se sugiere
pero esto también se puede lograr de una manera más corta.
trabaja también con:
Y si desea poder rellenar de ambas maneras:
que se puede escribir de forma más corta sin usar el corte.
ahora si intentas rellenar 'averylongword' con 2 ... ese no es mi problema.
Dije que te doy una propina.
La mayoría de las veces si rellena lo hace por el mismo valor N veces.
¡El uso de cualquier tipo de función dentro de un ciclo ralentiza el ciclo!
Entonces, si solo desea dejar algunos números dentro de una larga lista, no use funciones para hacer esta cosa simple.
usa algo como esto:
si no sabe cómo el tamaño máximo de relleno se basa en los números dentro de la matriz.
fuente
return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
. Y como siempre: chicos, no solo copie el código que no entiende.Con ES8, hay dos opciones para el relleno.
Puedes consultarlos en la documentación.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
fuente
Tomando las ideas de Samuel, aquí arriba. Y recuerda un antiguo script SQL, probé con esto:
Funciona en todos los casos que pude imaginar:
fuente
La cadena de relleno se ha implementado en la nueva versión de JavaScript.
str.padStart(targetLength [, padString])
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart
Si desea su propia función, consulte este ejemplo:
fuente
Aquí hay una función simple que uso.
Por ejemplo:
fuente
Un camino corto:
Ejemplo:
volver: "001234"
fuente
String.prototype.padStart()
debería ser más fácil.es7 es solo borradores y propuestas en este momento, pero si desea realizar un seguimiento de la compatibilidad con la especificación, sus funciones de pad necesitan:
Desde mi biblioteca de polyfill, pero aplique su propia diligencia debida para las extensiones de prototipo.
fuente
Aquí hay una respuesta simple en básicamente una línea de código.
Asegúrese de que el número de caracteres en su relleno, ceros aquí, sea al menos igual a la longitud mínima deseada. Entonces, realmente, para ponerlo en una línea, para obtener un resultado de "00035" en este caso es:
fuente
Las manipulaciones de matriz son realmente lentas en comparación con el simple concat de cadena. Por supuesto, punto de referencia para su caso de uso.
fuente
Una variante de la respuesta de @Daniel LaFavers .
Por ejemplo:
fuente
Es 2014, y sugiero una función de relleno de cadenas Javascript. ¡Decir ah!
Desnudos: almohadilla derecha con espacios
Fantasía: almohadilla con opciones
Uso (elegante):
fuente
Si no le importa incluir una biblioteca de utilidades, la biblioteca lodash tiene las funciones _.pad, _.padLeft y _.padRight .
fuente
Creo que es mejor evitar la recurrencia porque es costoso.
fuente
Aquí hay una función de JavaScript que agrega un número específico de rellenos con un symble personalizado. La función toma tres parámetros.
fuente
Y luego puedes hacer:
fuente
Si solo desea rellenar con una sola línea hacky muy simple, simplemente haga una cadena del carácter de relleno deseado de la longitud máxima de relleno deseada y luego suéltelo a la longitud de lo que desea rellenar.
Ejemplo: rellenar el almacén de cadenas
e
con espacios de hasta 25 caracteres.Resultado:
"hello "
Si desea hacer lo mismo con un número como entrada, simplemente llame
.toString()
antes.fuente
Array(n).join(c)
para configurar la longitud del relleno y el carácter del relleno, por ejemploArray(26).join(' ')
.otra toma con la combinación de un par de soluciones
fuente
Un amigo preguntó sobre el uso de una función de JavaScript para rellenar a la izquierda. Se convirtió en un pequeño esfuerzo entre algunos de nosotros en el chat para codificarlo. Este fue el resultado:
Asegura que el valor a rellenar es una cadena, y luego, si no es la longitud de la longitud total deseada, la rellenará una vez y luego se repetirá. Así es como se ve con un nombre y estructura más lógicos
El ejemplo que estábamos usando era asegurarnos de que los números se rellenaran
0
a la izquierda para hacer una longitud máxima de 6. Aquí hay un conjunto de ejemplos:fuente
Un poco tarde, pero pensé que podría compartir de todos modos. Me pareció útil agregar una extensión prototipo a Object. De esa manera puedo rellenar números y cadenas, izquierda o derecha. Tengo un módulo con utilidades similares que incluyo en mis scripts.
~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~
fuente
str = pad + str;
), ya que los datos se reasignarán cada vez. Añadir siempre al final!str += pad;
). Es mucho más rápido agregar la cadena de relleno a sí mismo y extraer los primeros x-chars (el analizador puede hacer esto de manera eficiente si extrae del primer carácter). Este es un crecimiento exponencial, lo que significa que desperdicia algo de memoria temporalmente (no debe hacerlo con textos extremadamente grandes).fuente
Aquí está mi opinión
No estoy tan seguro de su rendimiento, pero me parece mucho más legible que otras opciones que vi por aquí ...
fuente