Есть ли функция 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>

Но я понятия не имею, какого черта это делает, и это, кажется, не работает для меня.


Ответы:


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 символов здесь).
Денис V

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

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

6
Это необходимо обновить, чтобы использовать JS- String библиотеки String.padStart()и String.padEnd()для заполнения слева / справа.
SudoKid

119

Более быстрый метод

Если вы делаете это многократно, например, для заполнения значений в массиве, и производительность является фактором, следующий подход может дать вам почти 100-кратное преимущество по скорости ( jsPerf ) по сравнению с другими решениями, которые в настоящее время обсуждаются на веб-узлах . Основная идея заключается в том, что вы предоставляете функции pad полностью заполненную пустую строку для использования в качестве буфера. Функция pad просто добавляет строку для добавления к этой предварительно дополненной строке (одна строка 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);
  }
}

Например, чтобы обнулить число до 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 - это пробел: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 года; доступен полифилл ).


13
Теперь поддерживается всеми (современными) браузерами: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sphinxxx

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

1
Пожалуйста, добавьте пример использования, теперь, когда это поддерживается всеми современными браузерами. Это следует поощрять.
Франклин Ю

Черт возьми, как я не слышал об этом до сегодняшнего дня? Это должен быть принятый ответ.
электровир

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, который работает таким же образом.

Для совместимости браузера (и полезного полифилла) смотрите эту ссылку .


Лучший ответ ЗДЕСЬ на сегодня! 2019!
Питер Краусс

22

Используя метод String # repeat в ECMAScript 6 , функция pad так же проста, как:

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

Используя метод String # repeat и Arrow метода ECMAScript 6, функция pad очень проста:

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;
Дэвид Г

это не работает для не-строк. Как в 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
Гман

14

Ключевой трюк в обоих этих решениях заключается в создании arrayэкземпляра с заданным размером (на единицу больше требуемой длины), а затем немедленном вызове join()метода для создания string. join()Метод передается Заполнитель 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)
}

Эта простая функция поддерживает число или строку в качестве входных данных

пэд по умолчанию составляет 2 символа

значение по умолчанию - 0

так что я могу просто написать

padL(1);
// 01

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

padL(1,3);
// 001

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

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

РЕДАКТИРОВАТЬ @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 
)

*/

Теперь, если вы попытаетесь дополнить '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"
*/

Очень хорошо! Пришел к тому же результату, просто как примечание: это приводит строку к максимальной заданной длине, и пустая строка будет на один символ слишком короткой, а неопределенная строка приведет к использованию «неопределенного» 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

строка дополнения была дополнена в новой версии 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. Pad по умолчанию в пространстве

Из моей библиотеки 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;
}

Fancy: накладка с опциями

/**
 * @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()на него раньше.


Это на самом деле довольно аккуратно, не как функция общего назначения - но я мог бы видеть это как допустимый хак в некоторых контекстах для сохранения цикла.
'16

Интересная идея. @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;). Гораздо быстрее добавить строку дополнения к себе и извлечь первые x-символы (синтаксический анализатор может сделать это эффективно, если вы извлекаете из первого символа). Это экспоненциальный рост, что означает, что он временно тратит часть памяти (вы не должны делать это с чрезвычайно большими текстами).

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.