Ich benötige eine JavaScript-Funktion, die einen Wert annehmen und auf eine bestimmte Länge auffüllen kann (ich benötige Leerzeichen, aber alles würde funktionieren). Ich habe das gefunden:
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;
};
Beispiel:
<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>
Aber ich habe keine Ahnung, was zum Teufel es tut und es scheint nicht für mich zu funktionieren.
javascript
string
Anthony Potts
quelle
quelle
Antworten:
Ich habe diese Lösung hier gefunden und das ist für mich viel einfacher:
Und hier habe ich das String-Objekt erweitert:
Ein Beispiel, um es zu verwenden:
Dies gibt eine Zeit im Format "15:30" zurück.
quelle
String
Bibliotheken zu verwendenString.padStart()
undString.padEnd()
um links / rechts aufzufüllen.Eine schnellere Methode
Wenn Sie dies immer wieder tun, zum Beispiel Pad - Werte in einem Array, und die Leistung ist ein Faktor, kann der folgende Ansatz , den Sie gibt fast einen 100x Vorteil in der Geschwindigkeit ( jsPerf ) über andere Lösung , die derzeit auf den Zwischenstegen diskutiert werden. Die Grundidee ist, dass Sie der Pad-Funktion eine vollständig aufgefüllte leere Zeichenfolge zur Verfügung stellen, die als Puffer verwendet werden kann. Die Pad-Funktion hängt nur an die Zeichenfolge an, die zu dieser vorgepolsterten Zeichenfolge hinzugefügt werden soll (eine Zeichenfolge concat), und schneidet oder schneidet das Ergebnis dann auf die gewünschte Länge.
Wenn Sie beispielsweise eine Zahl mit einer Länge von 10 Ziffern auf Null setzen möchten,
Um eine Zeichenfolge mit Leerzeichen aufzufüllen, sodass die gesamte Zeichenfolge 255 Zeichen umfasst,
Leistungstest
Sehen Sie hier den jsPerf- Test .
Und das ist auch
string.repeat
2x schneller als ES6 , wie der überarbeitete JsPerf hier zeigtquelle
string.repeat
Methode. Wenn Sie also viel mit Saiten auffüllen, versuchen Sie dies auf jeden Fall.http://www.webtoolkit.info/javascript_pad.html
Es ist viel besser lesbar.
quelle
pad("hello", 20) = "hello "
Hier ist ein rekursiver Ansatz.
Ein Beispiel...
quelle
String.prototype.padStart()
undString.prototype.padEnd()
sind derzeit Vorschläge für TC39-Kandidaten: siehe github.com/tc39/proposal-string-pad-start-end (nur in Firefox ab April 2016 verfügbar ; eine Polyfüllung ist verfügbar).quelle
myString.padStart(padLength [, padString])
undmyString.padEnd(padLength [, padString])
ECMAScript 2017 fügt dem String-Prototyp eine padStart-Methode hinzu. Diese Methode füllt eine Zeichenfolge mit Leerzeichen auf eine bestimmte Länge auf. Diese Methode verwendet auch eine optionale Zeichenfolge, die anstelle von Leerzeichen zum Auffüllen verwendet wird.
Es wurde auch eine padEnd-Methode hinzugefügt, die auf die gleiche Weise funktioniert.
Informationen zur Browserkompatibilität (und einer nützlichen Polyfüllung) finden Sie unter diesem Link .
quelle
Mit der ECMAScript 6-Methode String # repeat ist eine Pad-Funktion so einfach wie:
String#repeat
wird derzeit nur in Firefox und Chrome unterstützt. Für eine andere Implementierung könnte man die folgende einfache Polyfüllung in Betracht ziehen:quelle
Mit der ECMAScript 6-Methode String # repeat und Arrow ist eine Pad-Funktion so einfach wie:
jsfiddle
bearbeiten: Vorschlag aus den Kommentaren:
Auf diese Weise wird kein Fehler ausgegeben, wenn er
s.length
größer als istn
edit2: Vorschlag aus den Kommentaren:
Auf diese Weise können Sie die Funktion sowohl für Zeichenfolgen als auch für Nicht-Zeichenfolgen verwenden.
quelle
s.length
es größer ist alsn
es werfen wird. Schlagen Sie vor:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
leftPad(12, ' ', 5)
. Obwohl ich genau weiß, dass dies in Ordnung sein könnte, ist dies wahrscheinlich einer der häufigsten Anwendungsfälle (Auffüllen von Zahlen). Vielleichtfunction leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }
. Mit denfunction
Mitteln kann sich leftPad am Ende der Datei befinden. Ansonsten solltest du wohlconst
wedervar
noch verwendenlet
.len
?len
sollten
Der wichtigste Trick bei beiden Lösungen besteht darin, eine
array
Instanz mit einer bestimmten Größe (eine mehr als die gewünschte Länge) zu erstellen und dann sofort diejoin()
Methode zum Erstellen einer Instanz aufzurufenstring
. Derjoin()
Methode wird die Auffüllung übergebenstring
(Leerzeichen wahrscheinlich). Da dasarray
leer ist, werden die leeren Zellenstrings
während des Zusammenfügensarray
zu einem Ergebnis als leer gerendertstring
, und es bleibt nur die Auffüllung übrig. Es ist eine wirklich schöne Technik.quelle
Pad mit Standardwerten
Mir ist aufgefallen, dass ich das padLeft hauptsächlich für die Zeitumrechnung / das Auffüllen von Zahlen benötige
Also habe ich diese Funktion geschrieben
Diese einfache Funktion unterstützt Number oder String als Eingabe
Standard-Pad ist 2 Zeichen
Standardzeichen ist 0
so kann ich einfach schreiben
wenn ich das zweite Argument hinzufüge (Padbreite)
dritter Parameter (Pad Char)
EDIT @BananaAcid Wenn Sie einen undefinierten Wert oder eine Zeichenfolge mit der Länge 0 übergeben, erhalten Sie
0undefined
..so:wie vorgeschlagen
Dies kann aber auch kürzer erreicht werden.
funktioniert auch mit:
Und wenn Sie in der Lage sein möchten, auf beide Arten zu polstern:
die kürzer geschrieben werden kann, ohne Slice zu verwenden.
Wenn Sie nun versuchen, 'Averylongword' mit 2 zu füllen, ist das nicht mein Problem.
Sagte, dass ich dir einen Tipp gebe.
Wenn Sie auffüllen, tun Sie dies meistens N-mal für denselben Wert.
Die Verwendung einer beliebigen Funktion innerhalb einer Schleife verlangsamt die Schleife !!!
Wenn Sie also nur einige Zahlen in einer langen Liste belassen möchten, verwenden Sie keine Funktionen, um diese einfache Sache zu erledigen.
benutze so etwas:
Wenn Sie nicht wissen, wie die maximale Auffüllgröße auf den Zahlen im Array basiert.
quelle
return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
. Und wie immer: Ihr da draußen, kopiert nicht nur Code, den ihr nicht versteht.Mit ES8 gibt es zwei Möglichkeiten zum Auffüllen.
Sie können sie in der Dokumentation überprüfen.
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
quelle
Hier werden Samuels Ideen aufgegriffen. Und erinnere dich an ein altes SQL-Skript, das ich damit versucht habe:
Es funktioniert in allen Fällen, die ich mir vorstellen kann:
quelle
Die Füllzeichenfolge wurde in der neuen Javascript-Version implementiert.
str.padStart(targetLength [, padString])
https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart
Wenn Sie eine eigene Funktion wünschen, überprüfen Sie dieses Beispiel:
quelle
Hier ist eine einfache Funktion, die ich benutze.
Beispielsweise:
quelle
Ein kurzer Weg:
Beispiel:
Rückgabe: "001234"
quelle
String.prototype.padStart()
sollte vielleicht einfacher sein.es7 ist im Moment nur ein Entwurf und ein Vorschlag, aber wenn Sie die Kompatibilität mit der Spezifikation verfolgen möchten , benötigen Ihre Pad-Funktionen:
Aus meiner Polyfill-Bibliothek, aber wenden Sie Ihre eigene Due Diligence für Prototypenerweiterungen an.
quelle
Hier ist eine einfache Antwort in einer Codezeile.
Stellen Sie sicher, dass die Anzahl der Zeichen in Ihrem Abstand, hier Nullen, mindestens so hoch ist wie die beabsichtigte Mindestlänge. Um es in eine Zeile zu bringen und in diesem Fall ein Ergebnis von "00035" zu erhalten, gilt Folgendes:
quelle
Array-Manipulationen sind im Vergleich zu einfachen String-Concat sehr langsam. Natürlich Benchmark für Ihren Anwendungsfall.
quelle
Eine Variante der Antwort von @Daniel LaFavers .
Beispielsweise:
quelle
Es ist 2014 und ich schlage eine Javascript-Funktion zum Auffüllen von Zeichenfolgen vor. Ha!
Nackte Knochen: Rechtspolster mit Leerzeichen
Phantasie: Pad mit Optionen
Verwendung (Phantasie):
quelle
Wenn es Ihnen nichts ausmacht, eine Dienstprogrammbibliothek einzuschließen, verfügt die lodash- Bibliothek über die Funktionen _.pad, _.padLeft und _.padRight .
quelle
Ich denke, es ist besser, eine Rekursion zu vermeiden, weil es teuer ist.
quelle
Hier ist eine JavaScript-Funktion, die eine bestimmte Anzahl von Auffüllungen mit benutzerdefiniertem Symble hinzufügt. Die Funktion akzeptiert drei Parameter.
quelle
Und dann können Sie tun:
quelle
Wenn Sie nur einen sehr einfachen, hackigen Einzeiler zum Auffüllen benötigen, erstellen Sie einfach eine Zeichenfolge mit dem gewünschten Auffüllcharakter der gewünschten maximalen Auffülllänge und teilen Sie sie dann auf die Länge des gewünschten Auffüllens auf.
Beispiel: Auffüllen des Zeichenfolgenspeichers
e
mit Leerzeichen bis zu 25 Zeichen.Ergebnis:
"hello "
Wenn Sie dasselbe mit einer Nummer als Eingabe tun möchten, rufen Sie
.toString()
sie einfach vorher an.quelle
Array(n).join(c)
konfigurierbar machen, zArray(26).join(' ')
.Noch eine Einstellung mit der Kombination einiger Lösungen
quelle
Ein Freund fragte nach der Verwendung einer JavaScript-Funktion, um links aufzufüllen. Es wurde zu einem kleinen Unterfangen zwischen einigen von uns im Chat, Golf zu spielen. Dies war das Ergebnis:
Es stellt sicher, dass der aufzufüllende Wert eine Zeichenfolge ist. Wenn er nicht der Länge der gewünschten Gesamtlänge entspricht, wird er einmal aufgefüllt und dann wiederholt. So sieht es mit logischerer Benennung und Struktur aus
Das Beispiel, das wir verwendet haben, war sicherzustellen, dass die Zahlen
0
links aufgefüllt wurden , um eine maximale Länge von 6 zu erreichen. Hier ein Beispielsatz:quelle
Ein bisschen spät, dachte aber, ich könnte es trotzdem teilen. Ich fand es nützlich, Object eine Prototyp-Erweiterung hinzuzufügen. Auf diese Weise kann ich links und rechts Zahlen und Zeichenfolgen auffüllen. Ich habe ein Modul mit ähnlichen Dienstprogrammen, die ich in meine Skripte einbinde.
~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~~
quelle
str = pad + str;
Fügen Sie niemals irgendwo Daten ein (insbesondere nicht am Anfang, wie ), da die Daten jedes Mal neu zugewiesen werden. Immer am Ende anhängen!str += pad;
). Es ist viel schneller, die Füllzeichenfolge an sich selbst anzuhängen und die ersten x-Zeichen zu extrahieren (der Parser kann dies effizient ausführen, wenn Sie aus dem ersten Zeichen extrahieren). Dies ist ein exponentielles Wachstum, was bedeutet, dass vorübergehend Speicherplatz verschwendet wird (Sie sollten dies nicht mit extrem großen Texten tun).quelle
Hier ist meine Einstellung
Ich bin mir über die Leistung nicht so sicher, aber ich finde es viel besser lesbar als andere Optionen, die ich hier gesehen habe ...
quelle