有没有一个JavaScript函数可以填充字符串以达到确定的长度?更快的方法

2022-08-29 23:57:11

我需要一个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;
};



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

答案 1

EcmaScript 2017 添加了 String.padStart(以及 String.padEnd)就是为了这个目的:

"Jonas".padStart(10); // Default pad string is a space
"42".padStart(6, "0"); // Pad with "0"
"*".padStart(8, "-/|\\"); // produces '-/|\\-/|*'

如果 JS 宿主中不存在,可以添加为 polyfill。String.padStart

ES-2017 之前

我在这里找到了这个解决方案,这对我来说要简单得多:

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”格式返回时间


答案 2

更快的方法

如果您反复执行此操作,例如在数组中填充值,并且性能是一个因素,则与当前在inter Web上讨论的其他解决方案相比,以下方法可以在速度(jsPerf)方面为您提供近100倍的优势。基本思想是,您为 pad 函数提供一个完全填充的空字符串,以用作缓冲区。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快2倍,正如这里修订的JsPerf所示string.repeat

请注意,不再在线jsPerf

请注意,我们最初用于对各种方法进行基准测试的jsPerf站点已不再在线。不幸的是,这意味着我们无法获得这些测试结果。可悲但真实。