Есть ли функция JavaScript, которая может дополнить строку, чтобы получить определенную длину? - PullRequest
256 голосов
/ 22 апреля 2010

Мне нужна функция 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>

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

Ответы [ 42 ]

2 голосов
/ 01 декабря 2013

Вариант ответа @ 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 голосов
/ 26 октября 2015

Если вы не против включить библиотеку утилит, библиотека lodash имеет функции _. Pad, _.padLeft и _.padRight .

1 голос
/ 01 апреля 2014

Если вы хотите, чтобы очень простой хакерский однострочник дополнял, просто создайте строку с нужным символом заполнения требуемой максимальной длины заполнения, а затем подставьте ее в длину, которую вы хотите заполнить.

Пример: заполнение хранилища строк в e пробелами до 25 символов.

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

Результат: "hello "

Если вы хотите сделать то же самое с номером в качестве ввода, просто наберите .toString() до этого.

1 голос
/ 07 января 2014

Вот функция JavaScript, которая добавляет указанное количество отступов с пользовательским символом. функция принимает три параметра.

    padMe --> string or number to left pad
    pads  --> number of pads
    padSymble --> custom symble, default is "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());
    }
/* Here are some results:

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

*/
1 голос
/ 13 марта 2016

Немного опоздал, но подумал, что могу поделиться в любом случае. Я нашел полезным добавить расширение прототипа для объекта. Таким образом, я могу дополнить числа и строки, влево или вправо. У меня есть модуль с похожими утилитами, которые я включаю в свои скрипты.

// 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 голос
/ 05 декабря 2015

Друг спросил об использовании функции 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 голос
/ 22 января 2015

еще один вариант с сочетанием нескольких решений

/**
 * 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 голос
/ 19 августа 2016
  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);
    }
}
1 голос
/ 12 июня 2013
/**************************************************************************************************
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 /171096/povtorite-stroku-javascript#171102
      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 "
0 голосов
/ 14 мая 2013

Вот мой дубль

Я не уверен в его производительности, но нахожу его гораздо более читабельным, чем другие варианты, которые я видел здесь ...

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);
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...