Чи існує функція JavaScript, яка може прокладати рядок, щоб дістатися до визначеної довжини?


272

Мені потрібна функція JavaScript, яка може приймати значення і додавати його до заданої довжини (мені потрібні пробіли, але все, що б зробити). Я знайшов це:

Код:

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>

Але я поняття не маю, що чорт це робить, і, здається, це не працює на мене.


Відповіді:


515

Я знайшов це рішення тут , і це для мене набагато простіше:

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
Легко найбільш читаний і стислий підхід, який я знайшов; досить простий, що я взагалі навіть не турбуюсь про розширення прототипу (принаймні, лише для кількох застосувань у додатку). Молодці.
бричін

32
Будьте в курсі, це рішення скоротить рядки, довші аргументу фрагмента (тобто тут 5 символів).
Денис V

1
Привіт Яніве. У вас є дуже гарна пропозиція змінити алгоритм. Однак у моєму випадку вимоги завжди передують цій проблемі, оскільки коли я намагаюся щось відформатувати, у мене завжди є мінімум специфікацій щодо значення, яке мені доводиться лікувати, і в цьому випадку специфікації виправлять цю проблему. Наприклад, якщо у мене є номер телефону для форматування, і я обробляю телефон лише в Канаді, я підтверджую, що номер телефону має 10 символів перед його форматуванням. У будь-якому випадку ваше рішення теж чудове. :)
Самуїл

1
Якщо ви робите це багато (наприклад , оббивка довгий список значень в списку якої - то на вашій сторінці або в іншому додатку) також побачити відповідь з більш швидким методом в stackoverflow.com/questions/2686855 / ...
Shyam Habarakada

6
Це погано потребує оновлення, щоб використовувати JS String в'язки String.padStart()та String.padEnd()для лівої / правої накладки.
SudoKid

119

Більш швидкий метод

Якщо ви робите це неодноразово, наприклад, для прокладки значень у масиві, а продуктивність є фактором, наступний підхід може дати вам майже 100- кратну перевагу в швидкості ( jsPerf ) перед іншими рішеннями, про які зараз йде мова в інтернеті. Основна ідея полягає в тому, що ви забезпечуєте функцію прокладки повністю прокладеною порожньою рядком для використання в якості буфера. Функція "pad" просто додає рядок, який потрібно додати до цієї попередньо накладеної рядки (один рядок), а потім розрізає або обрізає результат на потрібну довжину.

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

Наприклад, на нульовому майданчику число до довжини 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в 2 рази, як показано в переглянутому JsPerf тут


5
+1 Частина моєї проблеми зі StackOverflow - це нездатність модераторів змінювати голоси, спираючись на відповіді, які явно переважають. Це один із таких випадків.
Джейсон Себрінг

1
Як виявив хтось інший у пізнішому jsPerf (посилання, додані вище), цей підхід ~ 2 рази швидший, ніж string.repeatметод ES6 . Тож якщо ви робите багато накладок для струн, обов'язково спробуйте це.
Шям Хабаракада

5
Мене бентежить коментар Джейсона - чим ця відповідь відрізняється від прийнятої?
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é Malan

40

Ось рекурсивний підхід до цього.

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

Приклад...

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

7
також є рекурсивне визначення цілого множення ... завжди пам’ятайте, що в рекурсивному є "прокляття" ...
потік

32
Також на вулиці є наркомани та п'яний хлопець, але жодне з них не є актуальним. Прокляття рекурсії застосовується лише тоді, коли програміст не знає, коли це доречно.
hypno7oad

12
"Прокляття рекурсії застосовується лише тоді, коли програміст не знає, коли це доречно" Або коли вони не усвідомлюють, що це недоречно. Наприклад, для простої функції накладки струнних колодок.
Данація

Це досить елегантно і чудово спрацювало для мого використання. Якщо вам потрібно прокласти пробіли для вирівнювання тексту, просто киньте довжину найдовшої рядки =)
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 року; polyfill доступний).


13
Зараз підтримується всіма сучасними браузерами: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sphinxxx

Для ледачих: myString.padStart(padLength [, padString])іmyString.padEnd(padLength [, padString])
Йохан Деттмар

1
Будь ласка, додайте кілька прикладів використання, коли це підтримується всіма сучасними браузерами. Це слід заохочувати.
Франклін Ю

Святе лайно, як я не чув про це до сьогодні ?? Це має бути прийнятою відповіддю.
електровірус

29

ECMAScript 2017 додає до прототипу String метод padStart. Цей метод прокладе рядок з пробілами до заданої довжини. Цей метод також займає необов'язковий рядок, який буде використовуватися замість пробілів для набивання.

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

Також додано метод padEnd, який працює таким же чином.

Для сумісності веб-переглядачів (і корисної поліфіли) див. Це посилання .


Найкраща відповідь ТУТ на сьогодні! 2019 рік!
Пітер Краус

22

Використовуючи метод ECMAScript 6 String # повтор , функція накладки настільки ж проста, як:

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

String#repeatнаразі підтримується лише у Firefox та Chrome. для іншої реалізації можна розглянути наступний простий поліфактор:

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, рядок # повтор та стрілки, функція накладки проста, як:

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

До, lenмає бутиn
gman

14

Основний трюк в обох цих рішеннях - створити arrayекземпляр із заданим розміром (на один більше потрібної довжини), а потім негайно викликати join()метод для створення а string. join()Метод передається Заповнювач string(прогалини , ймовірно). Оскільки arrayпусте поле порожнє, порожні комірки будуть виведені як порожні stringsпід час процесу приєднання arrayдо одного результату string, і залишиться лише прокладка. Це дійсно приємна техніка.


10

pad із значеннями за замовчуванням

Я помітив, що мені найбільше потрібен padLeft для перетворення часу / прокладки чисел

тому я написав цю функцію

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

Ця проста функція підтримує число або рядок як вхід

типовий майданчик - 2 знаки

Значення за замовчуванням - 0

тому я можу просто написати

padL(1);
// 01

якщо я додаю другий аргумент (ширина колодки)

padL(1,3);
// 001

третій параметр (pad char)

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

EDIT @BananaAcid, якщо ви передаєте невизначене значення або рядок довжини 0, який ви отримаєте0undefined ..so:

як запропоновано

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 
)

*/

Тепер, якщо ви спробуєте прокласти "кожне слово" з 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"
*/

Дуже хороша! Вийшов з таким же результатом, як і примітка: це стискає рядок на максимальну задану довжину, а порожня рядок буде одним знаком занадто коротким, а невизначена стрічка призведе до "невизначеного" використання, а також з’єднання може призвести до помилки - комбіновані. 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

рядок padding доповнений у новій версії javascript.

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

Цю відповідь згадували багато інших відповідей, тож це дублікат, який не додає нової інформації. Будь ласка, шукайте, перш ніж відповісти.
Франклін Ю

Цей перший із повним підписом. І це має бути єдиною відповіддю на сьогодні.
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()повинно бути легше.
Макс Пенг

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, яка додає вказану кількість прокладок із спеціальними символами. функція приймає три параметри.

    padMe -> рядок або номер на панелі зліва
    колодки -> кількість колодок
    padSymble -> спеціальний символ, за замовчуванням - "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 "

Не возиться з прототипами!
Ріхардс

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

Друг запитав про використання функції JavaScript для прокладки зліва. Це перетворилося на трохи зусиль між деякими з нас у чаті, щоб кодувати його. Це був результат:

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;). Набагато швидше додати рядок padding до себе та витягнути перші x-символи (аналізатор може це зробити ефективно, якщо витягнути з першого char). Це експоненціальне зростання, а це означає, що воно тимчасово витрачає деяку пам’ять (не слід робити цього з надзвичайно величезними текстами).

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);
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.