[javascript] 정해진 길이에 도달하기 위해 문자열을 채울 수있는 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));
}