정해진 길이에 도달하기 위해 문자열을 채울 수있는 JavaScript 함수가 있습니까? 와서 주어진 길이로

값을 가져 와서 주어진 길이로 채울 수있는 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>

그러나 나는 그것이 무엇을하고 있는지 알지 못하며 나에게는 효과가없는 것 같습니다.



답변

나는이 해결책을 여기 에서 찾았고 이것은 훨씬 간단합니다.

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″형식으로 시간을 반환합니다


답변

더 빠른 방법

예를 들어 배열의 값을 채우는 등의 작업을 반복적으로 수행하고 성능이 중요한 요소 인 경우 다음 접근 방식 은 현재 웹에서 논의중인 다른 솔루션에 비해 속도 ( jsPerf )가 거의 100 배나 유리 합니다. 기본 아이디어는 버퍼로 사용하기 위해 패드 기능에 완전히 채워진 빈 문자열을 제공한다는 것입니다. 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 자리 길이로 0으로 채우려면

pad('0000000000',123,true);

문자열을 공백으로 채우려면 전체 문자열이 255 자입니다.

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

성능 테스트

여기서 jsPerf 테스트를 참조 하십시오 .

그리고 이것은 string.repeat수정 된 JsPerf에 표시된 것처럼 ES6보다 2 배 빠릅니다 .


답변

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;

}

훨씬 더 읽기 쉽습니다.


답변

여기에 재귀 접근 방식이 있습니다.

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

예를 들면 …

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

답변

String.prototype.padStart()그리고 String.prototype.padEnd()현재 TC39 후보의 제안은 다음과 같습니다 참조 github.com/tc39/proposal-string-pad-start-end을 (4 월 2016 파이어 폭스에서만 사용할 수 있습니다; polyfill이 가능).


답변

ECMAScript 2017은 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 메소드도 추가되었습니다.

브라우저 호환성 (및 유용한 polyfill) 은이 링크를 참조하십시오 .


답변

ECMAScript 6 메소드 String # repeat를 사용하면 다음 과 같은 간단한 패드 함수가 가능합니다.

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