มีฟังก์ชั่นจาวาสคริปต์ที่สามารถวางสตริงเพื่อให้ได้ความยาวที่กำหนดหรือไม่?


272

ฉันต้องการฟังก์ชั่นจาวาสคริปต์ที่สามารถนำค่าและแผ่นมาให้ความยาวที่กำหนด (ฉันต้องการช่องว่าง แต่สิ่งที่จะทำ) ฉันพบสิ่งนี้:

รหัส:

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;
};

ตัวอย่าง:

<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>

แต่ฉันไม่รู้ว่ามันกำลังทำอะไรอยู่และดูเหมือนจะไม่เหมาะกับฉัน


8

คำตอบ:


516

ฉันพบวิธีแก้ปัญหานี้ที่นี่และนี่สำหรับฉันง่ายขึ้นมาก:

var n = 123

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

และที่นี่ฉันทำส่วนขยายไปยังวัตถุสตริง:

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

ตัวอย่างการใช้งาน:

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;
    });
};

นี่จะส่งคืนเวลาในรูปแบบ "15:30"


11
เป็นวิธีที่อ่านง่ายและกระชับที่สุดที่ฉันค้นพบ ง่ายพอที่โดยทั่วไปฉันจะไม่รำคาญกับส่วนขยายต้นแบบ (อย่างน้อยก็สำหรับการใช้งานเพียงไม่กี่ครั้งในแอป) ทำได้ดี.
brichins

32
โปรดระวังวิธีนี้จะทำให้สตริงที่สั้นกว่าอาร์กิวเมนต์ slice สั้นลง (เช่น 5 chars ที่นี่)
เดนิส V

1
สวัสดี Yaniv คุณมีข้อเสนอแนะที่ดีมากในการปรับเปลี่ยนอัลกอริทึม อย่างไรก็ตามในกรณีของฉันข้อกำหนดมักนำหน้าปัญหานี้เสมอเพราะเมื่อฉันพยายามจัดรูปแบบบางอย่างฉันมักมีข้อกำหนดขั้นต่ำเกี่ยวกับค่าที่ฉันต้องปฏิบัติและในกรณีนี้ข้อมูลจำเพาะจะแก้ไขปัญหานี้ได้ ตัวอย่างเช่นหากฉันมีหมายเลขโทรศัพท์ที่จะจัดรูปแบบและฉันจัดการกับโทรศัพท์ในแคนาดาเท่านั้นฉันจะตรวจสอบว่าหมายเลขโทรศัพท์มีอักขระ 10 ตัวก่อนทำการฟอร์แมต ไม่ว่าในกรณีใดโซลูชันของคุณก็ยอดเยี่ยมเช่นกัน :)
ซามูเอล

1
หากคุณกำลังทำสิ่งนี้มาก (เช่นการเติมรายการยาว ๆ ในรายการของการเรียงลำดับในหน้าของคุณหรือแอปพลิเคชันอื่น ๆ ) ก็จะเห็นคำตอบด้วยวิธีที่รวดเร็วกว่าที่stackoverflow.com/questions/2686855/
......

6
จำเป็นต้องได้รับการอัปเดตเพื่อใช้ JS String libs String.padStart()และString.padEnd()สำหรับการเพิ่มซ้าย / ขวา
SudoKid

119

วิธีที่เร็วกว่า

หากคุณทำเช่นนี้ซ้ำ ๆ เช่นการใส่ค่าในอาเรย์และประสิทธิภาพเป็นปัจจัยวิธีต่อไปนี้สามารถให้คุณได้เปรียบ 100xในเรื่องความเร็ว ( jsPerf ) เหนือโซลูชันอื่น ๆ ที่กล่าวถึงบนอินเตอร์เว็บ แนวคิดพื้นฐานคือคุณให้ฟังก์ชั่นแผ่นกับสตริงที่ว่างเปล่าเบาะเต็มเพื่อใช้เป็นบัฟเฟอร์ ฟังก์ชั่นแผ่นเพียงแค่ผนวกกับสตริงที่จะเพิ่มลงในสตริง pre-padded นี้ (หนึ่ง concat สตริง) แล้วชิ้นหรือตัดผลการลดความยาวที่ต้องการ

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);
  }
}

ตัวอย่างเช่นหากต้องการ zero pad ตัวเลขให้มีความยาว 10 หลัก

pad('0000000000',123,true);

เพื่อรองสตริงที่มีช่องว่างดังนั้นสตริงทั้งหมดคือ 255 อักขระ

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

การทดสอบประสิทธิภาพ

ดูjsPerfทดสอบที่นี่

และนี่ก็เร็วกว่า ES6 string.repeatคูณ 2x เช่นกันตามที่แสดงโดย JsPerf ที่แก้ไขที่นี่


5
+1 ปัญหาของฉันกับ StackOverflow คือผู้ดูแลไม่สามารถเปลี่ยนคะแนนโหวตตามคำตอบที่ดีกว่าอย่างชัดเจน นี่เป็นหนึ่งในกรณีเหล่านั้น
Jason Sebring

1
ในขณะที่คนอื่นพิสูจน์แล้วใน jsPerf (ลิงก์ที่เพิ่มด้านบน) ในภายหลังวิธีนี้จะเร็วกว่า 2x2 เท่าstring.repeatวิธีES6 ดังนั้นหากคุณกำลังทำสายแพดจำนวนมากลองทำสิ่งนี้อย่างแน่นอน
Shyam Habarakada

5
ฉันสับสนกับคำวิจารณ์ของ Jason - คำตอบนี้แตกต่างจากที่ยอมรับอย่างไร
corwin.amber

1
ฉันดู jsPerf ของคุณ การทดสอบเหล่านั้นมีไว้สำหรับฟังก์ชั่นของคุณและบางอย่างที่ใช้วง while () ซึ่งไม่มีคำตอบอันดับสูงอื่น ๆ ที่ใช้ ฉันไม่แน่ใจนั่นหมายความว่ามันเร็วกว่าหรือ
HoldOffHunger

48

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;

}

มันอ่านได้มากขึ้น


1
ดูเหมือนจะไม่ทำงานเมื่อแผ่นเป็นพื้นที่:pad("hello", 20) = "hello "
Cilliéลัน

40

นี่เป็นวิธีแบบเรียกซ้ำ

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

ตัวอย่าง...

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

7
นอกจากนี้ยังมีคำจำกัดความซ้ำของการคูณจำนวนเต็ม ... โปรดจำไว้เสมอว่ามี 'คำสาป' ในการเรียกซ้ำ ...
flow

32
นอกจากนี้ยังมีนาร์whalsและคนเมาไปตามถนน แต่ก็ไม่เกี่ยวข้องกัน คำสาปของการเรียกซ้ำใช้เฉพาะเมื่อโปรแกรมเมอร์ไม่ทราบว่าเหมาะสมหรือไม่
hypno7oad

12
"คำสาปของการเรียกซ้ำใช้เฉพาะเมื่อโปรแกรมเมอร์ไม่ทราบว่าเหมาะสมหรือไม่หรือเมื่อพวกเขาไม่รู้ว่ามันไม่เหมาะสม เช่นฟังก์ชั่นแผ่นสตริงที่เรียบง่าย
Danation

นี่สวยมากและใช้งานได้ดีกับเคสของฉัน หากคุณต้องการเว้นช่องว่างเพื่อจัดแนวข้อความเพียงแค่โยนความยาวของสตริงที่ยาวที่สุด =)
Damon Aw

12
มันสวยงาม แต่ก็ยังสร้างสตริงใหม่ในฟังก์ชั่นการวนซ้ำแต่ละครั้ง ฟังก์ชันนี้คือ O (n) ในขณะที่โซลูชันที่ได้รับความนิยมมากที่สุดโดย @Samuel คือ O (1) ทั้งสองมีความสง่างาม แต่มีประสิทธิภาพมากขึ้นอย่างมากมาย ที่กล่าวว่ามันเป็นวิธีที่เรียบร้อยและอาจจะเร็วกว่าในภาษาอื่น
บดขยี้

40

String.prototype.padStart()และString.prototype.padEnd()ขณะนี้ TC39 ข้อเสนอผู้สมัคร: ดูgithub.com/tc39/proposal-string-pad-start-end (ใช้ได้เฉพาะใน Firefox ณ เมษายน 2016; a polyfillสามารถใช้ได้)


13
สนับสนุนโดยเบราว์เซอร์ (ทันสมัย) ทั้งหมดในขณะนี้: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sphinxxx

สำหรับคนขี้เกียจ: myString.padStart(padLength [, padString])และmyString.padEnd(padLength [, padString])
Johan Dettmar

1
โปรดเพิ่มตัวอย่างการใช้งานในขณะนี้ซึ่งได้รับการสนับสนุนโดยเบราว์เซอร์ที่ทันสมัยทั้งหมด สิ่งนี้ควรได้รับการสนับสนุน
Franklin Yu

อึศักดิ์สิทธิ์ฉันไม่เคยได้ยินเรื่องนี้มาจนถึงวันนี้ได้อย่างไร นี่ควรเป็นคำตอบที่ยอมรับได้
electrovir

29

ECMAScript 2017 เพิ่มเมธอด padStart ให้กับต้นแบบ String วิธีนี้จะรองสตริงที่มีช่องว่างตามความยาวที่กำหนด วิธีนี้ยังใช้สตริงตัวเลือกที่จะใช้แทนช่องว่างสำหรับการขยาย

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

มีการเพิ่มวิธีการ padEnd ที่ทำงานในลักษณะเดียวกัน

สำหรับความเข้ากันได้ของเบราว์เซอร์ (และ polyfill ที่มีประโยชน์) ให้ดูที่ลิงก์นี้


คำตอบที่ดีที่สุดสำหรับทุกวันนี้! 2019!
Peter Krauss

22

การใช้ ECMAScript 6 method String # repeat ซ้ำฟังก์ชั่น pad นั้นง่ายเหมือน:

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

String#repeatขณะนี้รองรับ Firefox และ Chrome เท่านั้น สำหรับการใช้งานอื่น ๆ หนึ่งอาจพิจารณา polyfill ง่าย ๆ ต่อไปนี้:

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

สำหรับผู้ที่ทำงานใน Node.js รองรับการใช้งาน String.repeat
jkt123

15

การใช้ฟังก์ชัน ECMAScript 6 String # ทำซ้ำและฟังก์ชั่นลูกศร , ฟังก์ชั่นแผ่นเป็นเรื่องง่ายเหมือน:

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

jsfiddle

แก้ไข: ข้อเสนอแนะจากความคิดเห็น:

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

ด้วยวิธีนี้มันจะไม่เกิดข้อผิดพลาดเมื่อs.lengthยิ่งใหญ่กว่าn

edit2: ข้อเสนอแนะจากความคิดเห็น:

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

ด้วยวิธีนี้คุณสามารถใช้ฟังก์ชันสำหรับสตริงและสตริงไม่เหมือนกัน


1
นี่เป็นสิ่งที่ดี แต่ถ้าs.lengthมากกว่าnนั้นก็จะโยน คำแนะนำ:let leftPad = (s, c, n) => n - s.length > 0 ? c.repeat(n - s.length) + s : s;
David G

มันใช้งานไม่ได้กับสตริง leftPad(12, ' ', 5)ในฐานะที่เป็น ในขณะที่ฉันรู้ว่าพูดอย่างเคร่งครัดที่อาจตกลงก็อาจเป็นหนึ่งในกรณีที่ใช้บ่อยที่สุด (หมายเลขแพ็ดดิ้ง) function leftPad(s, c, n) { s = s.toString(); return s.length > len ? s : c.repeat(n - s.length) + s; }บางที การใช้functionหมายความว่า leftPad สามารถอยู่ที่ด้านล่างของไฟล์ มิฉะนั้นคุณควรใช้เนื้อหาconstไม่ได้หรือvar let
gman

@ gman ขอบคุณสำหรับคำแนะนำนี้ แต่ตัวแปรของคุณคือlenอะไร
InsOp

Doh lenควรเป็นn
gman

14

เคล็ดลับสำคัญในโซลูชันทั้งสองนั้นคือการสร้างarrayอินสแตนซ์ที่มีขนาดที่กำหนด (มากกว่าหนึ่งความยาวที่ต้องการ) จากนั้นจึงเรียกใช้join()เมธอดเพื่อสร้าง a stringทันที join()วิธีการที่ผ่าน padding string(พื้นที่อาจ) เนื่องจากarrayเซลล์ว่างเปล่าเซลล์ว่างจะถูกแสดงผลเป็นว่างstringsในระหว่างกระบวนการเข้าร่วมarrayในผลลัพธ์stringเดียวและจะมีเพียงการเว้นว่างเท่านั้น มันเป็นเทคนิคที่ดีจริงๆ


10

แผ่นที่มีค่าเริ่มต้น

ฉันสังเกตเห็นว่าฉันต้องการ padLeft เป็นส่วนใหญ่สำหรับการแปลงเวลา / การเติมเต็มจำนวน

ดังนั้นฉันจึงเขียนฟังก์ชั่นนี้

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

ฟังก์ชันง่าย ๆ นี้รองรับNumberหรือStringเป็นอินพุต

แผ่นเริ่มต้นคือ2 ตัวอักษร

ถ่านเริ่มต้นคือ0

ดังนั้นฉันสามารถเขียนได้

padL(1);
// 01

ถ้าฉันเพิ่มอาร์กิวเมนต์ที่สอง (ความกว้างของแผ่น)

padL(1,3);
// 001

พารามิเตอร์ที่สาม (แผ่นถ่าน)

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

แก้ไข @BanaanaAcid หากคุณผ่านค่าที่ไม่ได้กำหนดหรือสตริงความยาว 0 คุณจะได้รับ .. 0undefinedso:

ตามที่แนะนำ

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

แต่สิ่งนี้สามารถทำได้ในวิธีที่สั้นกว่า

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

ทำงานร่วมกับ:

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

และถ้าคุณต้องการที่จะได้ทั้งสองวิธี:

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)
}

ซึ่งสามารถเขียนในวิธีที่สั้นลงโดยไม่ต้องใช้ชิ้น

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 
)

*/

ตอนนี้ถ้าคุณพยายามที่จะวาง 'averylongword' ด้วย 2 ... นั่นไม่ใช่ปัญหาของฉัน


บอกว่าฉันให้คำแนะนำแก่คุณ

ส่วนใหญ่เวลาที่คุณแพดคุณทำมันด้วยค่าเดียวกัน N ครั้ง

การใช้ฟังก์ชั่นประเภทใดก็ได้ภายในลูปจะทำให้ลูปช้าลง !!!

ดังนั้นถ้าคุณแค่อยากจะใส่ตัวเลขบางส่วนในรายการยาว ๆ อย่าใช้ฟังก์ชั่นในการทำสิ่งนี้

ใช้สิ่งนี้:

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

หากคุณไม่ทราบว่าขนาดการแพ็ดสูงสุดตามตัวเลขภายในอาเรย์

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"
*/

ดีมาก! มาพร้อมกับผลลัพธ์เดียวกันเช่นเดียวกับบันทึกย่อ: สิ่งนี้เชื่อมสตริงเข้ากับความยาวสูงสุดที่กำหนดและสตริงว่างจะสั้นเกินไปหนึ่งอักขระและ str ที่ไม่ได้กำหนดจะส่งผลให้ beeing 'ไม่ได้กำหนด' และประกบกันอาจทำให้เกิดข้อผิดพลาด - รวมกัน return (new Array((b||1)+1).join(c||0)+(a||'')).slice(-(b||2)). และเช่นเคย: พวกคุณออกไปอย่าคัดลอกโค้ดที่คุณไม่เข้าใจ
BananaAcid

1
(อาร์เรย์ใหม่ (b || 2). join (c || 0) + (a || c || 0)). slice (-b) ... สั้นลง
cocco


9

สละความคิดของซามูเอลขึ้นไปที่นี่ และจำสคริปต์ SQL ตัวเก่าฉันลองด้วย:

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

มันใช้งานได้ในทุกกรณีที่ฉันนึกภาพได้:

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

5

สตริงการเติมเต็มได้รับการใช้งานในเวอร์ชันจาวาสคริปต์ใหม่

str.padStart(targetLength [, padString])

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

หากคุณต้องการฟังก์ชั่นของคุณเองตรวจสอบตัวอย่างนี้:

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

คำตอบนี้ได้รับการกล่าวถึงโดยคำตอบอื่น ๆ หลายคำตอบดังนั้นจึงเป็นเรื่องซ้ำซ้อนที่ไม่เพิ่มข้อมูลใหม่ กรุณาค้นหาก่อนคำตอบ
Franklin Yu

อันนี้เป็นอันแรกที่มีลายเซ็นเต็ม และมันจะต้องเป็นคำตอบเดียวของวันนี้
d_f

4

นี่คือฟังก์ชั่นพื้นฐานที่ฉันใช้

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;
};

ตัวอย่างเช่น:

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

4

วิธีสั้น ๆ :

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

ตัวอย่าง:

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

ส่งคืน: "001234"


1
อาจString.prototype.padStart()จะง่ายกว่านี้
Max Peng

3

es7เป็นเพียงร่างและข้อเสนอในขณะนี้ แต่ถ้าคุณต้องการติดตามความเข้ากันได้กับข้อมูลจำเพาะฟังก์ชั่นแผ่นของคุณต้องการ:

  1. รองรับแผ่นหลายตัว
  2. อย่าตัดสตริงอินพุต
  3. แผ่นค่าเริ่มต้นไปยังพื้นที่

จากห้องสมุด polyfill ของฉัน แต่ใช้ความขยันเนื่องจากของคุณเองสำหรับส่วนขยายต้นแบบ

// 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

นี่คือคำตอบง่ายๆโดยทั่วไปในโค้ดหนึ่งบรรทัด

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

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

ตรวจสอบให้แน่ใจว่าจำนวนตัวอักษรในช่องว่างภายในคุณเป็นศูนย์อย่างน้อยที่สุดเท่าที่คุณต้องการ ดังนั้นการใส่ลงในหนึ่งบรรทัดเพื่อให้ได้ผลลัพธ์ของ "00035" ในกรณีนี้คือ:

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

2

การเรียงลำดับอาเรย์นั้นช้ามากเมื่อเทียบกับการเรียงสตริงแบบเรียบง่าย แน่นอนเกณฑ์มาตรฐานสำหรับกรณีการใช้งานของคุณ

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

ตัวแปรของคำตอบ@Daniel LaFavers

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;
};

ตัวอย่างเช่น:

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

2

มันคือปี 2014 และฉันแนะนำให้ใช้ฟังก์ชันการเติมสตริง Javascript ฮา!

กระดูกเปลือยเท้าขวามีช่องว่าง

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

แฟนซี: แผ่นที่มีตัวเลือก

/**
 * @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;
}

การใช้งาน (แฟนซี):

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

ฉันคิดว่ามันดีกว่าที่จะหลีกเลี่ยงการเรียกซ้ำเพราะมันแพง

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));


1

นี่คือฟังก์ชั่น JavaScript ที่เพิ่มจำนวนของ paddings ที่ระบุด้วย symble ที่กำหนดเอง ฟังก์ชั่นใช้สามพารามิเตอร์

    padMe -> string หรือตัวเลขไปทางซ้าย pad
    แผ่น -> จำนวนแผ่น
    padSymble -> symble ที่กำหนดเองค่าเริ่มต้นคือ "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());
    }
/ * นี่คือผลลัพธ์บางส่วน:

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

* /

1
/**************************************************************************************************
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;
}

จากนั้นคุณสามารถทำได้:

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

อย่ายุ่งกับต้นแบบ!
Rihards

1

หากคุณต้องการเพียงแค่ซับหนึ่งซับในแผ่นแฮ็คที่ง่ายมากเพียงแค่สร้างสตริงของอักขระการขยายที่ต้องการของความยาวการขยายสูงสุดที่ต้องการและจากนั้นซับสตริงให้เท่ากับความยาวของสิ่งที่คุณต้องการวาง

ตัวอย่าง: การขยายที่เก็บสตริงeด้วยช่องว่างยาว 25 อักขระ

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

ผลลัพธ์: "hello "

หากคุณต้องการทำเช่นเดียวกันกับตัวเลขเป็นอินพุตเพียงโทรหา.toString()มันก่อน


อันนี้ค่อนข้างเรียบร้อยไม่ใช่ฟังก์ชั่นวัตถุประสงค์ทั่วไป - แต่ฉันเห็นว่านี่เป็นการแฮ็คที่ถูกต้องในบริบทบางอย่างเพื่อบันทึกลูป
ankr

ความคิดที่น่าสนใจ @ankr จะใช้มันเป็นฟังก์ชั่นอเนกประสงค์, คุณสามารถใช้เพื่อให้ระยะเวลาในการขยายและการขยายตัวอักษรที่กำหนดเช่นArray(n).join(c) Array(26).join(' ')
WynandB

1

อีกอย่างหนึ่งใช้กับการรวมกันของโซลูชั่นคู่

/**
 * 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

เพื่อนคนหนึ่งถามเกี่ยวกับการใช้ฟังก์ชั่นจาวาสคริปต์ในการวางทิ้งไว้ มันกลายเป็นความพยายามเล็กน้อยระหว่างเราบางคนในการแชทกับรหัสกอล์ฟ นี่คือผลลัพธ์ที่ได้:

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

มันช่วยให้มั่นใจได้ว่าค่าที่จะเพิ่มเป็นสตริงและจากนั้นหากไม่ใช่ความยาวของความยาวทั้งหมดที่ต้องการมันจะรองลงมาหนึ่งครั้ง นี่คือสิ่งที่ดูเหมือนกับการตั้งชื่อตรรกะและโครงสร้าง

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

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

ตัวอย่างที่เราใช้คือเพื่อให้แน่ใจว่าตัวเลขถูกเติมด้วย0ด้านซ้ายเพื่อให้มีความยาวสูงสุด 6 ตัวนี่คือตัวอย่างชุด:

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

สายไปหน่อย แต่คิดว่าฉันจะแชร์ได้ ฉันพบว่ามีประโยชน์ในการเพิ่มส่วนขยายต้นแบบลงใน Object ด้วยวิธีนี้ฉันสามารถวางตัวเลขและสตริงซ้ายหรือขวา ฉันมีโมดูลที่มียูทิลิตี้ที่คล้ายกันซึ่งรวมอยู่ในสคริปต์ของฉัน

// 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
  1. อย่าใส่ข้อมูลในที่อื่น (โดยเฉพาะอย่างยิ่งไม่ใช่ตอนเริ่มต้นเช่น str = pad + str; ) เนื่องจากข้อมูลจะถูกจัดสรรใหม่ทุกครั้ง ผนวกท้ายเสมอ!
  2. อย่ารัดสตริงของคุณในวง ทิ้งไว้คนเดียวและสร้างสตริงแผ่นของคุณก่อน ในที่สุดเชื่อมต่อกับสตริงหลักของคุณ
  3. อย่ากำหนดสตริงการขยายในแต่ละครั้ง (เช่นstr += pad;) มันเร็วกว่ามากในการผนวกสตริงการขยายไปยังตัวเองและแยก x-chars แรก (ตัวแยกวิเคราะห์สามารถทำสิ่งนี้ได้อย่างมีประสิทธิภาพหากคุณแยกจากอักขระตัวแรก) นี่คือการเติบโตแบบเลขชี้กำลังซึ่งหมายความว่ามันจะสูญเสียความทรงจำไปชั่วคราว (คุณไม่ควรใช้ข้อความขนาดใหญ่มาก)

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);
    }
}


0

นี่คือสิ่งที่ฉันต้องใช้

ฉันไม่แน่ใจเกี่ยวกับประสิทธิภาพของมัน แต่ฉันพบว่าอ่านได้มากกว่าตัวเลือกอื่น ๆ ที่ฉันเห็นที่นี่ ...

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);
};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.