J'ai besoin d'une fonction JavaScript qui peut prendre une valeur et la remplir à une longueur donnée (j'ai besoin d'espaces, mais tout ferait l'affaire). J'ai trouvé ça:
Code:
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;
};
Exemple:
<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>
Mais je n'ai aucune idée de ce que ça fait et ça ne semble pas fonctionner pour moi.
javascript
string
Anthony Potts
la source
la source
Réponses:
J'ai trouvé cette solution ici et c'est pour moi beaucoup plus simple:
Et ici, j'ai fait une extension à l'objet chaîne:
Un exemple pour l'utiliser:
Cela renverra une heure au format "15:30"
la source
String
bibliothèques JSString.padStart()
etString.padEnd()
pour le remplissage gauche / droite.Une méthode plus rapide
Si vous effectuez cette opération à plusieurs reprises, par exemple pour ajouter des valeurs dans un tableau, et que les performances sont un facteur, l'approche suivante peut vous donner un avantage de vitesse presque 100 fois supérieur ( jsPerf ) par rapport à d'autres solutions qui sont actuellement discutées sur les sites Web. L'idée de base est que vous fournissez la fonction pad avec une chaîne vide entièrement rembourrée à utiliser comme tampon. La fonction pad ajoute simplement à la chaîne à ajouter à cette chaîne pré-remplie (une chaîne concat), puis tranche ou ajuste le résultat à la longueur souhaitée.
Par exemple, pour mettre à zéro un nombre sur une longueur de 10 chiffres,
Pour remplir une chaîne avec des espaces, afin que la chaîne entière soit de 255 caractères,
Test de performance
Voir le test jsPerf ici .
Et cela est également plus rapide que ES6
string.repeat
de 2x, comme le montre le JsPerf révisé icila source
string.repeat
méthode ES6 . Donc, si vous faites beaucoup de remplissage de chaîne, essayez certainement ceci.http://www.webtoolkit.info/javascript_pad.html
C'est beaucoup plus lisible.
la source
pad("hello", 20) = "hello "
Voici une approche récursive.
Un exemple...
la source
String.prototype.padStart()
etString.prototype.padEnd()
sont actuellement des propositions de candidats TC39: voir github.com/tc39/proposal-string-pad-start-end (uniquement disponible dans Firefox à partir d'avril 2016; un polyfill est disponible).la source
myString.padStart(padLength [, padString])
etmyString.padEnd(padLength [, padString])
ECMAScript 2017 ajoute une méthode padStart au prototype String. Cette méthode remplira une chaîne avec des espaces à une longueur donnée. Cette méthode prend également une chaîne facultative qui sera utilisée à la place des espaces pour le remplissage.
Une méthode padEnd a également été ajoutée et fonctionne de la même manière.
Pour la compatibilité du navigateur (et un polyfill utile), consultez ce lien .
la source
En utilisant la méthode ECMAScript 6 String # repeat , une fonction pad est aussi simple que:
String#repeat
est actuellement pris en charge uniquement dans Firefox et Chrome. pour d'autres implémentations, on pourrait envisager le polyfill simple suivant:la source
En utilisant la méthode ECMAScript 6 , les fonctions de répétition de chaîne et de flèche , une fonction de pad est aussi simple que:
jsfiddle
edit: suggestion des commentaires:
de cette façon, il ne générera pas d'erreur quand il
s.length
est supérieur àn
edit2: suggestion des commentaires:
de cette façon, vous pouvez utiliser la fonction pour les chaînes et les non-chaînes.
la source
s.length
est plus grandn
qu'il n'en jettera. Suggérer:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
leftPad(12, ' ', 5)
. Bien que je sache à proprement parler que cela pourrait être correct, c'est probablement l'un des cas d'utilisation les plus courants (numéros de remplissage). Peut-êtrefunction leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }
. Utiliser lesfunction
moyens leftPad peut être au bas du fichier. Sinon, vous ne devriez sans douteconst
pas utiliser nivar
nilet
.len
?len
devrait êtren
L'astuce clé dans ces deux solutions est de créer une
array
instance avec une taille donnée (une de plus que la longueur souhaitée), puis d'appeler immédiatement lajoin()
méthode pour créer unstring
. Lajoin()
méthode est passée le remplissagestring
(espaces probablement). Puisque learray
est vide, les cellules vides seront rendues videsstrings
pendant le processus de jointure duarray
résultat en un seul résultatstring
, et seul le remplissage restera. C'est une technique vraiment sympa.la source
pad avec des valeurs par défaut
J'ai remarqué que j'avais surtout besoin de padLeft pour la conversion de temps / le remplissage des nombres
donc j'ai écrit cette fonction
Cette fonction simple prend en charge Number ou String en entrée
le pavé par défaut est de 2 caractères
le caractère par défaut est 0
donc je peux simplement écrire
si j'ajoute le deuxième argument (largeur du tampon)
troisième paramètre (pad char)
EDIT @BananaAcid si vous passez une valeur non définie ou une chaîne de longueur 0, vous obtenez
0undefined
..so:comme suggéré
mais cela peut également être réalisé de manière plus courte.
travaille également avec:
Et si vous voulez être en mesure de remplir les deux façons:
qui peut être écrit de manière plus courte sans utiliser de tranche.
maintenant si vous essayez de garnir 'averylongword' avec 2 ... ce n'est pas mon problème.
Dit que je vous donne un pourboire.
La plupart du temps, si vous remplissez, vous le faites pour la même valeur N fois.
L'utilisation de tout type de fonction dans une boucle ralentit la boucle !!!
Donc, si vous voulez simplement laisser quelques chiffres dans une longue liste, n'utilisez pas de fonctions pour faire cette chose simple.
utilisez quelque chose comme ceci:
si vous ne savez pas comment la taille de remplissage maximale est basée sur les nombres à l'intérieur du tableau.
la source
return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
. Et comme toujours: vous les gars, ne copiez pas seulement du code que vous ne comprenez pas.Avec ES8, il existe deux options de remplissage.
Vous pouvez les vérifier dans la documentation.
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
la source
Reprenant les idées de Samuel, vers le haut ici. Et rappelez-vous un ancien script SQL, j'ai essayé avec ceci:
Cela fonctionne dans tous les cas que j'imagine:
la source
la chaîne de remplissage a été insérée dans la nouvelle version javascript.
str.padStart(targetLength [, padString])
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart
Si vous voulez votre propre fonction, vérifiez cet exemple:
la source
Voici une fonction simple que j'utilise.
Par exemple:
la source
Un court chemin:
Exemple:
retour: "001234"
la source
String.prototype.padStart()
devrait peut -être être plus facile.es7 n'est que des ébauches et des propositions en ce moment, mais si vous voulez suivre la compatibilité avec la spécification, vos fonctions de pad ont besoin de:
Depuis ma bibliothèque polyfill, mais appliquez votre propre diligence raisonnable pour les extensions de prototype.
la source
Voici une réponse simple en une seule ligne de code.
Assurez-vous que le nombre de caractères dans votre remplissage, zéros ici, est au moins autant que votre longueur minimale prévue. Donc, vraiment, pour le mettre sur une seule ligne, obtenir un résultat de "00035" dans ce cas est:
la source
Les manipulations de tableaux sont vraiment lentes par rapport à la simple concaténation de chaînes. Bien sûr, référence pour votre cas d'utilisation.
la source
Une variante de la réponse de @Daniel LaFavers .
Par exemple:
la source
Nous sommes en 2014, et je suggère une fonction de remplissage de chaîne Javascript. Ha!
Bare-bones: pad droit avec espaces
Fantaisie: pad avec options
Utilisation (fantaisie):
la source
Si cela ne vous dérange pas d'inclure une bibliothèque d'utilitaires, la bibliothèque lodash a les fonctions _.pad, _.padLeft et _.padRight .
la source
Je pense qu'il vaut mieux éviter la récursivité car c'est cher.
la source
Voici une fonction JavaScript qui ajoute un nombre spécifié de rembourrages avec symble personnalisé. la fonction prend trois paramètres.
la source
Et puis vous pouvez faire:
la source
Si vous voulez juste une doublure hacky très simple à garnir, faites simplement une chaîne du caractère de remplissage souhaité de la longueur de remplissage maximale souhaitée, puis sous-chaîne à la longueur de ce que vous voulez garnir.
Exemple: remplissage du magasin de chaînes
e
avec des espaces de 25 caractères.Résultat:
"hello "
Si vous voulez faire de même avec un numéro en entrée, appelez-
.toString()
le avant.la source
Array(n).join(c)
pour rendre la longueur de remplissage et le caractère de remplissage configurables, par exempleArray(26).join(' ')
.encore une autre prise avec une combinaison de quelques solutions
la source
Un ami a demandé à utiliser une fonction JavaScript pour remplir à gauche. Cela s'est transformé en un petit effort entre certains d'entre nous dans le chat pour coder le golf. Voici le résultat:
Il garantit que la valeur à remplir est une chaîne, puis si ce n'est pas la longueur de la longueur totale souhaitée, elle la remplira une fois, puis répétera. Voici à quoi cela ressemble avec une dénomination et une structure plus logiques
L'exemple que nous utilisions était de s'assurer que les nombres étaient remplis
0
vers la gauche pour faire une longueur maximale de 6. Voici un exemple d'ensemble:la source
Un peu tard, mais j'ai pensé que je pourrais quand même partager. J'ai trouvé utile d'ajouter une extension de prototype à Object. De cette façon, je peux remplir des nombres et des chaînes, à gauche ou à droite. J'ai un module avec des utilitaires similaires que j'inclus dans mes scripts.
~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~
la source
str = pad + str;
), car les données seront réallouées à chaque fois. Ajoutez toujours à la fin!str += pad;
). Il est beaucoup plus rapide d'ajouter la chaîne de remplissage à elle-même et d'extraire les premiers caractères X (l'analyseur peut le faire efficacement si vous extrayez du premier caractère). Il s'agit d'une croissance exponentielle, ce qui signifie qu'elle gaspille temporairement de la mémoire (vous ne devriez pas le faire avec des textes extrêmement volumineux).la source
Voici mon avis
Je ne suis pas sûr de ses performances, mais je le trouve beaucoup plus lisible que les autres options que j'ai vues ici ...
la source