webentwicklung-frage-antwort-db.com.de

Gibt es eine JavaScript-Funktion, mit der eine Zeichenfolge aufgefüllt werden kann, um eine bestimmte Länge zu erreichen?

Ich brauche eine JavaScript-Funktion, die einen Wert annehmen und auf eine bestimmte Länge auffüllen kann (ich brauche Leerzeichen, aber alles würde es tun). 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 für mich nicht zu funktionieren.

246
Anthony Potts

Ich habe diese Lösung gefunden hier und das ist für mich viel einfacher:

var n = 123

String("00000" + n).slice(-5); // returns 00123
("00000" + n).slice(-5); // returns 00123
("     " + n).slice(-5); // returns "  123" (with two spaces)

Und hier habe ich eine Erweiterung für das String-Objekt gemacht:

String.prototype.paddingLeft = function (paddingValue) {
   return String(paddingValue + this).slice(-paddingValue.length);
};

Ein Beispiel, um es zu benutzen:

function getFormattedTime(date) {
  var hours = date.getHours();
  var minutes = date.getMinutes();

  hours = hours.toString().paddingLeft("00");
  minutes = minutes.toString().paddingLeft("00");

  return "{0}:{1}".format(hours, minutes);
};

String.prototype.format = function () {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function (match, number) {
        return typeof args[number] != 'undefined' ? args[number] : match;
    });
};

Dies wird eine Zeit im Format "15:30" zurückgeben.

477
Samuel

Eine schnellere Methode

Wenn Sie dies wiederholt ausführen, um beispielsweise Werte in einem Array aufzufüllen, und die Leistung ein Faktor ist, können Sie mit der folgenden Methode einen 100-fachen Vorteil erzielen in der Geschwindigkeit ( jsPerf ) gegenüber anderen Lösungen, die derzeit auf den Zwischenwebseiten diskutiert werden. Die Grundidee ist, dass Sie die Pad-Funktion mit einer vollständig aufgefüllten leeren Zeichenfolge versehen, die als Puffer verwendet werden soll. Die Pad-Funktion hängt nur an die Zeichenfolge an, die zu dieser vorab aufgefüllten Zeichenfolge (eine Zeichenfolge concat) hinzugefügt werden soll, und schneidet oder schneidet das Ergebnis auf die gewünschte Länge.

function pad(pad, str, padLeft) {
  if (typeof str === 'undefined') 
    return pad;
  if (padLeft) {
    return (pad + str).slice(-pad.length);
  } else {
    return (str + pad).substring(0, pad.length);
  }
}

Wenn Sie beispielsweise eine 10-stellige Zahl auf null setzen möchten,

pad('0000000000',123,true);

So füllen Sie eine Zeichenfolge mit Leerzeichen auf: Die gesamte Zeichenfolge besteht aus 255 Zeichen.

var padding = Array(256).join(' '), // make a string of 255 spaces
pad(padding,123,true);

Leistungstest

Siehe den jsPerf Test hier .

Und das ist schneller als ES6 string.repeat auch 2x, wie das überarbeitete JsPerf hier zeigt

118

http://www.webtoolkit.info/javascript_pad.html

/**
*
*  Javascript string pad
*  http://www.webtoolkit.info/
*
**/

var STR_PAD_LEFT = 1;
var STR_PAD_RIGHT = 2;
var STR_PAD_BOTH = 3;

function pad(str, len, pad, dir) {

    if (typeof(len) == "undefined") { var len = 0; }
    if (typeof(pad) == "undefined") { var pad = ' '; }
    if (typeof(dir) == "undefined") { var dir = STR_PAD_RIGHT; }

    if (len + 1 >= str.length) {

        switch (dir){

            case STR_PAD_LEFT:
                str = Array(len + 1 - str.length).join(pad) + str;
            break;

            case STR_PAD_BOTH:
                var padlen = len - str.length;
                var right = Math.ceil( padlen / 2 );
                var left = padlen - right;
                str = Array(left+1).join(pad) + str + Array(right+1).join(pad);
            break;

            default:
                str = str + Array(len + 1 - str.length).join(pad);
            break;

        } // switch

    }

    return str;

}

Es ist viel lesbarer.

49
David

Hier ist ein rekursiver Ansatz. 

function pad(width, string, padding) { 
  return (width <= string.length) ? string : pad(width, padding + string, padding)
}

Ein Beispiel...

pad(5, 'hi', '0')
=> "000hi"
39
hypno7oad

String.prototype.padStart() und String.prototype.padEnd() sind derzeit Kandidaten für TC39-Kandidaten: siehe github.com/tc39/proposal-string-pad-start-end (nur in Firefox ab April 2016 verfügbar; eine polyfill ist verfügbar).

29
ChrisV

Bei Verwendung der ECMAScript 6-Methode String # repeat ist eine Pad-Funktion so einfach wie:

String.prototype.padLeft = function(char, length) { 
    return char.repeat(Math.max(0, length - this.length)) + this;
}

String#repeat wird derzeit nur in Firefox und Chrome unterstützt. Für andere Implementierungen kann man die folgende einfache Polyfill in Betracht ziehen:

String.prototype.repeat = String.prototype.repeat || function(n){ 
    return n<=1 ? this : (this + this.repeat(n-1)); 
}
22
Guss

ECMAScript 2017 fügt dem String-Prototyp eine padStart-Methode hinzu. Diese Methode füllt einen String mit Leerzeichen auf eine bestimmte Länge auf. Diese Methode benötigt auch eine optionale Zeichenfolge, die anstelle von Leerzeichen für das Auffüllen verwendet wird.

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0");     // "00000abc"
'abc'.padStart(1);          // "abc"

Eine PadEnd-Methode wurde hinzugefügt, die auf dieselbe Weise funktioniert.

Zur Browserkompatibilität (und einem nützlichen Polyfill) siehe diesen Link .

19
arMedBeta

Der Schlüsseltrick in diesen 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 die join()-Methode aufzurufen, um eine string zu erstellen. Die join()-Methode wird an die Auffüllung string übergeben (wahrscheinlich Leerzeichen). Da die Variable array leer ist, werden die leeren Zellen während des Prozesses des Verbindens der Variable strings in ein Ergebnis array als leere Variable string dargestellt, und es bleibt nur noch die Auffüllung. Es ist eine wirklich schöne Technik.

14
Pointy

Bei Verwendung der ECMAScript 6-Methode String # repeat und Arrow-Funktionen ist eine Pad-Funktion so einfach wie folgt:

var leftPad = (s, c, n) => c.repeat(n - s.length) + s;
leftPad("foo", "0", 5); //returns "00foo"

jsfiddle

edit: Vorschlag aus den Kommentaren:

const leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;

auf diese Weise wird kein Fehler ausgegeben, wenn s.length größer ist als n.

edit2: Vorschlag aus den Kommentaren:

const leftPad = (s, c, n) =>{ s = s.toString(); c = c.toString(); return s.length > n ? s : c.repeat(n - s.length) + s; }

auf diese Weise können Sie die Funktion für Strings und Nicht-Strings gleichermaßen verwenden.

13
InsOp

pad mit Standardwerten

Mir ist aufgefallen, dass ich meistens das padLeft zur Zeitkonvertierung/Zahlenauffüllung brauche

also habe ich diese Funktion geschrieben

function padL(a,b,c){//string/number,length=2,char=0
 return (new Array(b||2).join(c||0)+a).slice(-b)
}

Diese einfache Funktion unterstützt Number oder String als Eingabe

standard-Pad ist 2 Zeichen

standardwert ist 0

also kann ich einfach schreiben

padL(1);
// 01

wenn ich das zweite Argument hinzufüge (Padbreite)

padL(1,3);
// 001

dritter Parameter (Pad-Zeichen)

padL('zzz',10,'x');
// xxxxxxxzzz

EDIT @ BananaAcid Wenn Sie einen undefinierten Wert oder eine Zeichenfolge mit der Länge 0 übergeben, erhalten Sie 0undefined ..

wie vorgeschlagen

function padL(a,b,c){//string/number,length=2,char=0
 return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2))
}

dies kann aber auch auf kürzere Weise erreicht werden.

function padL(a,b,c){//string/number,length=2,char=0
 return (new Array(b||2).join(c||0)+(a||c||0)).slice(-b)
}

arbeitet auch mit:

padL(0)
padL(NaN)
padL('')
padL(undefined)
padL(false)

Und wenn Sie in der Lage sein wollen, auf beide Arten zu polstern:

function pad(a,b,c,d){//string/number,length=2,char=0,0/false=Left-1/true=Right
return a=(a||c||0),c=new Array(b||2).join(c||0),d?(a+c).slice(0,b):(c+a).slice(-b)
}

das kann kürzer geschrieben werden, ohne Slice zu verwenden.

function pad(a,b,c,d){
 return a=(a||c||0)+'',b=new Array((++b||3)-a.length).join(c||0),d?a+b:b+a
}
/*

Usage:

pad(
 input // (int or string) or undefined,NaN,false,empty string
       // default:0 or PadCharacter
 // optional
 ,PadLength // (int) default:2
 ,PadCharacter // (string or int) default:'0'
 ,PadDirection // (bolean) default:0 (padLeft) - (true or 1) is padRight 
)

*/

jetzt, wenn Sie versuchen, 'Averylongword' mit 2 zu füllen ... das ist nicht mein Problem.


Sagte, dass ich dir einen Tipp gebe.

Meistens, wenn Sie auffüllen, tun Sie dies 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 eingeben möchten, verwenden Sie keine Funktionen, um diese einfache Sache auszuführen.

benutze so etwas:

var arrayOfNumbers=[1,2,3,4,5,6,7],
    paddedArray=[],
    len=arrayOfNumbers.length;
while(len--){
 paddedArray[len]=('0000'+arrayOfNumbers[len]).slice(-4);
}

wenn Sie nicht wissen, wie die maximale Auffüllgröße basierend auf den Zahlen im Array ist.

var arrayOfNumbers=[1,2,3,4,5,6,7,49095],
    paddedArray=[],
    len=arrayOfNumbers.length;

// search the highest number
var arrayMax=Function.prototype.apply.bind(Math.max,null),
// get that string length
padSize=(arrayMax(arrayOfNumbers)+'').length,
// create a Padding string
padStr=new Array(padSize).join(0);
// and after you have all this static values cached start the loop.
while(len--){
 paddedArray[len]=(padStr+arrayOfNumbers[len]).slice(-padSize);//substr(-padSize)
}
console.log(paddedArray);

/*
0: "00001"
1: "00002"
2: "00003"
3: "00004"
4: "00005"
5: "00006"
6: "00007"
7: "49095"
*/
10
cocco
9
Sornii

Nimm die Ideen von Samuel hier auf. Und erinnere mich an ein altes SQL-Skript, das ich mit diesem versucht habe:

a=1234;
'0000'.slice(a.toString().length)+a;

Es funktioniert in allen Fällen, die ich mir vorstellen kann:

a=     1 result  0001
a=    12 result  0012
a=   123 result  0123
a=  1234 result  1234
a= 12345 result 12345
a=  '12' result  0012
6

Hier ist eine einfache Funktion, die ich benutze.

var pad=function(num,field){
    var n = '' + num;
    var w = n.length;
    var l = field.length;
    var pad = w < l ? l-w : 0;
    return field.substr(0,pad) + n;
};

Zum Beispiel:

pad    (20,'     ');    //   20
pad   (321,'     ');    //  321
pad (12345,'     ');    //12345
pad (   15,'00000');    //00015
pad (  999,'*****');    //**999
pad ('cat','_____');    //__cat  
4
Daniel LaFavers

die Füllzeichenfolge wurde in die neue Javascript-Version eingefügt.

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:

const myString = 'Welcome to my house';
String.prototype.padLeft = function(times = 0, str = ' ') {
    return (Array(times).join(str) + this);
}
console.log(myString.padLeft(12, ':'));
//:::::::::::Welcome to my house
4
daronwolff

Ein kurzer Weg:

(x=>(new Array(int-x.length+1)).join(char)+x)(String)

Beispiel:

(x=>(new Array(6-x.length+1)).join("0")+x)("1234")

rückkehr: "001234"

4

es7 ist momentan nur Entwürfe und Vorschläge, aber wenn Sie die Kompatibilität mit der Spezifikation verfolgen möchten, benötigen Ihre Pad-Funktionen:

  1. Multi-Character-Pad-Unterstützung.
  2. Schneiden Sie die Eingabezeichenfolge nicht ab
  3. Das Pad ist standardmäßig auf Leerzeichen eingestellt

Wenden Sie Ihre eigene Due-Diligence-Prüfung für Prototyp-Erweiterungen an.

// Tests
'hello'.lpad(4) === 'hello'
'hello'.rpad(4) === 'hello'
'hello'.lpad(10) === '     hello'
'hello'.rpad(10) === 'hello     '
'hello'.lpad(10, '1234') === '41234hello'
'hello'.rpad(10, '1234') === 'hello12341'

String.prototype.lpad || (String.prototype.lpad = function( length, pad )
{
    if( length < this.length ) return this;

    pad = pad || ' ';
    let str = this;

    while( str.length < length )
    {
        str = pad + str;
    }

    return str.substr( -length );
});

String.prototype.rpad || (String.prototype.rpad = function( length, pad )
{
    if( length < this.length ) return this;

    pad = pad || ' ';
    let str = this;

    while( str.length < length )
    {
        str += pad;
    }

    return str.substr( 0, length );
});
3
Adria

Hier ist eine einfache Antwort im Wesentlichen in einer Codezeile.

var value = 35 // the numerical value
var x = 5 // the minimum length of the string

var padded = ("00000" + value).substr(-x);

Stellen Sie sicher, dass die Anzahl der Zeichen in Ihrer Auffüllung, hier Nullen, mindestens so hoch ist wie Ihre beabsichtigte Mindestlänge. Um es in einer Zeile zusammenzufassen, in diesem Fall ein Ergebnis von "00035" zu erhalten, lautet:

var padded = ("00000" + 35).substr(-5);
3
Jack Thomson

Array-Manipulationen sind im Vergleich zu einfachen String-Concats sehr langsam. Natürlich Benchmark für Ihren Use Case.

function(string, length, pad_char, append) {
    string = string.toString();
    length = parseInt(length) || 1;
    pad_char = pad_char || ' ';

    while (string.length < length) {
        string = append ? string+pad_char : pad_char+string;
    }
    return string;
};
2
will Farrell

Eine Variante von @Daniel LaFavers ' answer.

var mask = function (background, foreground) {
  bg = (new String(background));
  fg = (new String(foreground));
  bgl = bg.length;
  fgl = fg.length;
  bgs = bg.substring(0, Math.max(0, bgl - fgl));
  fgs = fg.substring(Math.max(0, fgl - bgl));
  return bgs + fgs;
};

Zum Beispiel:

mask('00000', 11  );   // '00011'
mask('00011','00' );   // '00000'
mask( 2     , 3   );   // '3'
mask('0'    ,'111');   // '1'
mask('fork' ,'***');   // 'f***'
mask('_____','dog');   // '__dog'
2
Akseli Palén

Es ist 2014 und ich schlage eine Javascript-Funktion zum Auffüllen von Zeichenfolgen vor. Ha!

Nackte Knochen: rechte Unterlage mit Leerzeichen

function pad ( str, length ) {
    var padding = ( new Array( Math.max( length - str.length + 1, 0 ) ) ).join( " " );
    return str + padding;
}

Fancy: Pad mit Optionen

/**
 * @param {*}       str                         input string, or any other type (will be converted to string)
 * @param {number}  length                      desired length to pad the string to
 * @param {Object}  [opts]
 * @param {string}  [opts.padWith=" "]          char to use for padding
 * @param {boolean} [opts.padLeft=false]        whether to pad on the left
 * @param {boolean} [opts.collapseEmpty=false]  whether to return an empty string if the input was empty
 * @returns {string}
 */
function pad ( str, length, opts ) {
    var padding = ( new Array( Math.max( length - ( str + "" ).length + 1, 0 ) ) ).join( opts && opts.padWith || " " ),
        collapse = opts && opts.collapseEmpty && !( str + "" ).length;
    return collapse ? "" : opts && opts.padLeft ? padding + str : str + padding;
}

Verwendung (Phantasie):

pad( "123", 5 );
// returns "123  "

pad( 123, 5 );
// returns "123  " - non-string input

pad( "123", 5, { padWith: "0", padLeft: true } );
// returns "00123"

pad( "", 5 );
// returns "     "

pad( "", 5, { collapseEmpty: true } );
// returns ""

pad( "1234567", 5 );
// returns "1234567"
2
hashchange

Ich denke, es ist besser, Rekursion zu vermeiden, weil es kostspielig ist.

function padLeft(str,size,padwith) {
	if(size <= str.length) {
        // not padding is required.
		return str;
	} else {
        // 1- take array of size equal to number of padding char + 1. suppose if string is 55 and we want 00055 it means we have 3 padding char so array size should be 3 + 1 (+1 will explain below)
        // 2- now join this array with provided padding char (padwith) or default one ('0'). so it will produce '000'
        // 3- now append '000' with orginal string (str = 55), will produce 00055

        // why +1 in size of array? 
        // it is a trick, that we are joining an array of empty element with '0' (in our case)
        // if we want to join items with '0' then we should have at least 2 items in the array to get joined (array with single item doesn't need to get joined).
        // <item>0<item>0<item>0<item> to get 3 zero we need 4 (3+1) items in array   
		return Array(size-str.length+1).join(padwith||'0')+str
	}
}

alert(padLeft("59",5) + "\n" +
     padLeft("659",5) + "\n" +
     padLeft("5919",5) + "\n" +
     padLeft("59879",5) + "\n" +
     padLeft("5437899",5));

2

Wenn Sie nichts dagegen haben, eine Utility-Bibliothek hinzuzufügen, verfügt die lodash-Bibliothek über die Funktionen _.pad, _.padLeft und _.padRight .

2
Brian M. Hunt

Ein Freund fragte nach der Verwendung einer JavaScript-Funktion zum Auffüllen von Links. Es entwickelte sich zu einer kleinen Anstrengung zwischen einigen von uns im Chat, um Golf zu codieren. Das war das Ergebnis:

function l(p,t,v){
    v+="";return v.length>=t?v:l(p,t,p+v); 
}

Es stellt sicher, dass der aufgefüllte Wert eine Zeichenfolge ist. Wenn es nicht die Länge der gewünschten Gesamtlänge ist, wird es einmal aufgefüllt und dann erneut aufgerufen. So sieht es mit mehr logischer Benennung und Struktur aus

function padLeft(pad, totalLength, value){
    value = value.toString();

    if( value.length >= totalLength ){
        return value;
    }else{
        return padLeft(pad, totalLength, pad + value);
    }
}

Das Beispiel, das wir verwendeten, war, um sicherzustellen, dass die Zahlen mit 0 auf der linken Seite aufgefüllt wurden, um eine maximale Länge von 6 zu erreichen.

function l(p,t,v){v+="";return v.length>=t?v:l(p,t,p+v);}

var vals = [6451,123,466750];

var pad = l(0,6,vals[0]);// pad with 0's, max length 6

var pads = vals.map(function(i){ return l(0,6,i) });

document.write(pads.join("<br />"));

1
Travis J

Hier ist eine JavaScript-Funktion, die die angegebene Anzahl von Füllungen mit benutzerdefinierten Symbolen hinzufügt. Die Funktion hat drei Parameter.

 padMe -> Zeichenfolge oder Nummer zum linken Pad 
 Pads -> Anzahl der Pads 
 padSymble -> Benutzerdefiniertes Symbol, Standardeinstellung ist "0" 

    function leftPad(padMe, pads, padSymble) {
         if( typeof padMe === "undefined") {
             padMe = "";
         }
         if (typeof pads === "undefined") {
             pads = 0;
         }
         if (typeof padSymble === "undefined") {
             padSymble = "0";
         }

         var symble = "";
         var result = [];
         for(var i=0; i < pads ; i++) {
            symble += padSymble;
         }
        var length = symble.length - padMe.toString().length;
        result = symble.substring(0, length);
        return result.concat(padMe.toString());
    }
/* Hier einige Ergebnisse: 

> LeftPad (1) 
 "1" 
> LeftPad (1, 4) 
 "0001" 
> LeftPad (1 , 4, "0") 
 "0001" 
> LeftPad (1, 4, "@") 
 "@@@ 1" 

 */
1
yantaq

Wenn Sie nur einen sehr einfachen, hackigen One-Liner zum Auffüllen benötigen, machen Sie einfach eine Zeichenfolge des gewünschten Auffüllzeichens mit der gewünschten maximalen Auffülllänge, und geben Sie dann die Länge der gewünschten Auffüllung an. 

Beispiel: Auffüllen des Zeichenfolgenspeichers in e mit Leerzeichen auf 25 Zeichen.

var e = "hello"; e = e + "                         ".substring(e.length)

Ergebnis: "hello "

Wenn Sie dasselbe mit einer Nummer als Eingabe machen möchten, rufen Sie vorher .toString() auf.

1
qwertzguy

Etwas spät, dachte ich könnte es trotzdem erzählen. Ich fand es nützlich, eine Prototyperweiterung zu Object hinzuzufügen. Auf diese Weise kann ich Zahlen und Zeichenfolgen links oder rechts auffüllen. Ich habe ein Modul mit ähnlichen Dienstprogrammen, die ich in meine Skripte einfüge.

// include the module in your script, there is no need to export
var jsAddOns = require('<path to module>/jsAddOns');

~~~~~~~~~~~~ jsAddOns.js ~~~~~~~~~~~~~

/* 
 * method prototype for any Object to pad it's toString()
 * representation with additional characters to the specified length
 *
 * @param padToLength required int
 *     entire length of padded string (original + padding)
 * @param padChar optional char
 *     character to use for padding, default is white space
 * @param padLeft optional boolean
 *     if true padding added to left
 *     if omitted or false, padding added to right
 *
 * @return padded string or
 *     original string if length is >= padToLength
 */
Object.prototype.pad = function(padToLength, padChar, padLeft) {    

    // get the string value
    s = this.toString()

    // default padToLength to 0
    // if omitted, original string is returned
    padToLength = padToLength || 0;

    // default padChar to empty space
    padChar = padChar || ' ';


    // ignore padding if string too long
    if (s.length >= padToLength) {
        return s;
    }

    // create the pad of appropriate length
    var pad = Array(padToLength - s.length).join(padChar);

    // add pad to right or left side
    if (padLeft) {
        return pad  + s;        
    } else {
        return s + pad;
    }
};
1
user5925630
  1. Fügen Sie niemals irgendwo Daten ein (besonders nicht am Anfang, wie str = pad + str;), da die Daten jedes Mal neu zugewiesen werden. Füge immer am Ende hinzu!
  2. Füllen Sie Ihre Schnur nicht in der Schleife auf. Lass es in Ruhe und erstelle deinen Pad-String. Am Ende verketten Sie es mit Ihrer Hauptzeichenfolge.
  3. Weisen Sie nicht jedes Mal eine Auffüllzeichenfolge zu (wie str += pad;). Es ist viel schneller, die Auffüllzeichenfolge an sich selbst anzuhängen und die ersten X-Zeichen zu extrahieren (der Parser kann dies effizient tun, wenn Sie aus dem ersten Zeichen extrahieren). Dies ist ein exponentielles Wachstum, das bedeutet, dass vorübergehend Speicherplatz verschwendet wird (dies sollte bei extrem großen Texten nicht erfolgen).

if (!String.prototype.lpad) {
    String.prototype.lpad = function(pad, len) {
        while (pad.length < len) {
            pad += pad;
        }
        return pad.substr(0, len-this.length) + this;
    }
}

if (!String.prototype.rpad) {
    String.prototype.rpad = function(pad, len) {
        while (pad.length < len) {
            pad += pad;
        }
        return this + pad.substr(0, len-this.length);
    }
}

1
StanE
/**************************************************************************************************
Pad a string to pad_length fillig it with pad_char.
By default the function performs a left pad, unless pad_right is set to true.

If the value of pad_length is negative, less than, or equal to the length of the input string, no padding takes place.
**************************************************************************************************/
if(!String.prototype.pad)
String.prototype.pad = function(pad_char, pad_length, pad_right) 
{
   var result = this;
   if( (typeof pad_char === 'string') && (pad_char.length === 1) && (pad_length > this.length) )
   {
      var padding = new Array(pad_length - this.length + 1).join(pad_char); //thanks to http://stackoverflow.com/questions/202605/repeat-string-javascript/2433358#2433358
      result = (pad_right ? result + padding : padding + result);
   }
   return result;
}

Und dann kannst du tun:

alert( "3".pad("0", 3) ); //shows "003"
alert( "hi".pad(" ", 3) ); //shows " hi"
alert( "hi".pad(" ", 3, true) ); //shows "hi "
1
Marco Demaio

mit padStart 

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"

https://developer.mozilla.org/docs/Web/JavaScript/Referencia/Objetos_globales/String/padStart

noch ein anderer mit einer Kombination von ein paar Lösungen

/**
 * pad string on left
 * @param {number} number of digits to pad, default is 2
 * @param {string} string to use for padding, default is '0' *
 * @returns {string} padded string
 */
String.prototype.paddingLeft = function (b,c) {
    if (this.length > (b||2))
        return this+'';
  return (this||c||0)+'',b=new Array((++b||3)-this.length).join(c||0),b+this
};

/**
 * pad string on right
 * @param {number} number of digits to pad, default is 2
 * @param {string} string to use for padding, default is '0' *
 * @returns {string} padded string
 */
String.prototype.paddingRight = function (b,c) {
  if (this.length > (b||2))
        return this+'';
  return (this||c||0)+'',b=new Array((++b||3)-this.length).join(c||0),this+b
};    
1
Jeremiah

Alle Optionen enthalten 

function padding(stringToBePadded, paddingCharacter, totalLength, padLeftElseRight){
    //will pad any string provided in first argument, with padding character provide in 2nd argument and truncate to lenght provided in third argument, padding left if 4th argument true or undefined, right if false. 
    // i.e. padding("lode","x","10")  -->  "xxxxxxlode"
    // i.e. padding("lode","x","10",true)  -->  "xxxxxxlode"
    // i.e. padding("lode","x","10",false)  -->  "lodexxxxxx"
    // i.e. padding("12","0","5")  -->  "00012"
    {
        padLeftElseRight = typeof padLeftElseRight !== 'undefined' ? padLeftElseRight : true;
    }
    if (stringToBePadded.length > totalLength){
        // console.log("string too long to be padded");
        return stringToBePadded;
    }
    var paddingString = paddingCharacter.repeat(totalLength);//make long string of padding characters
    if ( padLeftElseRight){
        return String(paddingString+stringToBePadded).slice(-totalLength);
    }else{ 
        return String(stringToBePadded+paddingString).slice(0,totalLength); 
    }
}
0
lode

Ich mache das gerne, wenn Sie mit mehreren Zeichen oder Tags (z. B. &nbsp;) für die Anzeige auffüllen müssen:

$.padStringLeft = function(s, pad, len) {
    if(typeof s !== 'undefined') {
        var c=s.length; while(len > c) {s=pad+s;c++;}
    }
    return s;
}    

$.padStringRight = function(s, pad, len) {
    if(typeof s !== 'undefined') {
        var c=s.length; while(len > c) {s += pad;c++;}
    }
    return s;
}
0
td-lambda

verwenden Sie wiederholen, wäre es einfacher.

    var padLeft=function(str, pad, fw){
        return fw>str.length ? pad.repeat(fw-str.length)+str : str;
    }

sie können es wie folgt verwenden: padeLeft ('Origin-str', '0', 20)

0
legendJSLC

Hier ist mein Take

Ich bin nicht so sicher, was die Leistung angeht, aber ich finde es viel lesbarer als andere Optionen, die ich hier gesehen habe ...

var replicate = function(len, char) {
  return Array(len+1).join(char || ' ');
};

var padr = function(text, len, char) {
  if (text.length >= len) return text;
  return text + replicate(len-text.length, char);
};
0
opensas

Versuche dies:-

function leftPad(number) {
     return (number < 9)?'0'+number:number;
}

//call like this
var month=3;
month=leftPad(month);//output:- month=04
0
user3567805

Basierend auf den besten Antworten dieser Frage habe ich einen Prototyp für String mit dem Namen padLeft (genau wie in C #) erstellt:

String.prototype.padLeft = function (paddingChar, totalWidth) {
    if (this.toString().length >= totalWidth)
        return this.toString();

    var array = new Array(totalWidth); 

    for (i = 0; i < array.length; i++)
        array[i] = paddingChar;

    return (array.join("") + this.toString()).slice(-array.length);
}

Verwendungszweck:

var str = "12345";
console.log(str.padLeft("0", 10)); //Result is: "0000012345"

JsFiddle

0

Für so etwas könnte ich eine einzeilige Funktion an dem Punkt erstellen, an dem sie benötigt wird:

var padleft = (s,c,len) => { while(s.length < len) s = c + s; return s; }

Beispiel: 

> console.log( padleft( '110', '0', 8) );
> 00000110
0
Matthew Voss

Ein Liner, wenn Sie etwas Kompaktes wollen:

String.prototype.pad = function(len, chr){
        return((((new Array(len)).fill(chr)).join("") +this).substring(this.length));
}

0
Geordie
1. function
var _padLeft = function(paddingString, width, replacementChar) {
    return paddingString.length >= width ? paddingString : _padLeft(replacementChar + paddingString, width, replacementChar || ' ');
};

2. String prototype
String.prototype.padLeft = function(width, replacementChar) {
        return this.length >= width ? this.toString() : (replacementChar + this).padLeft(width, replacementChar || ' ');
};

3. slice
('00000' + paddingString).slice(-5)
0
kayz1

das ist meine Version der Funktion:

function str_pad(str, size, char, right) {
    var s = str + "";
    while (s.length < size) {
        if (right) {
            s = s + char;
        } else {
            s = char + s;
        }
    }
    return s;
}
0
MSS

meine Kombination aus oben genannten Lösungen wurde zu meiner eigenen, ständig weiterentwickelten Version hinzugefügt :)

//in preperation for ES6
String.prototype.lpad || (String.prototype.lpad = function( length, charOptional )
{
    if (length <= this.length) return this;
    return ( new Array((length||0)+1).join(String(charOptional)||' ') + (this||'') ).slice( -(length||0) );
});


'abc'.lpad(5,'.') == '..abc'
String(5679).lpad(10,0) == '0000005679'
String().lpad(4,'-') == '----' // repeat string
0
BananaAcid
String.prototype.padLeft = function(pad) {
        var s = Array.apply(null, Array(pad)).map(function() { return "0"; }).join('') + this;
        return s.slice(-1 * Math.max(this.length, pad));
    };

verwendungszweck:

  1. "123".padLeft(2) gibt zurück: "123"
  2. "12".padLeft(2) gibt zurück: "12"
  3. "1".padLeft(2) gibt zurück: "01"
0
Yaniv.H