선행 0으로 값을 채우려면 어떻게해야합니까?


394

JavaScript에서 값을 0으로 채우는 권장되는 방법은 무엇입니까? 타입 캐스팅 된 값에 0을 채우는 사용자 정의 함수를 만들 수 있다고 생각하지만 더 직접적인 방법이 있는지 궁금합니다.

참고 : "제로 채워짐"이란 단어의 데이터베이스 의미에서 의미합니다 (숫자 5의 6 자리 숫자로 채워진 표현은 "000005"입니다).


이것은 실제로 충분한 정보가 충분하지 않습니다. "제로 패딩"의 가장 일반적인 예는 아마도 날짜 앞에 0을 붙일 것입니다 : 5/1/2008> 05/01/2008. 이게 네가 말하는거야?
삼부작

6
노드 앱의 npm install sprintf-jssprintf('%0d6', 5);
경우을

function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;} ... n음이 아닌 것으로 가정
Paolo

@Paolo 그 함수는 n이 숫자이면 작동하지 않습니다. while액세스 하려면 n을 문자열로 변환해야합니다.n.length
Nick F

1
Math 또는 While 루프 나 라이브러리가없는 하나의 라이너? mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Adam Whateverson

답변:


225

독자에게 참고하십시오!

주석가들이 지적했듯이,이 솔루션은 "영리한"솔루션이며, 영리한 솔루션 인 것처럼 메모리 집약적이고 상대적으로 느립니다. 성능이 문제가되는 경우이 솔루션을 사용하지 마십시오!

구식 가능성 : ECMAScript 2017 포함 String.prototype.padStartNumber.prototype.toLocaleString는 ECMAScript를 3.1 이후있다. 예:

var n=-0.1;
n.toLocaleString('en', {minimumIntegerDigits:4,minimumFractionDigits:2,useGrouping:false})

"-0000.10"을 출력합니다.

// or 
const padded = (.1+"").padStart(6,"0");
`-${padded}`

"-0000.1"이 출력됩니다.

간단한 기능 만 있으면됩니다

function zeroFill( number, width )
{
  width -= number.toString().length;
  if ( width > 0 )
  {
    return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number;
  }
  return number + ""; // always return a string
}

네임 스페이스 등을 보존하려는 경우이를 라이브러리에 구울 수 있습니다. 와 같이 jQuery를이 확장이다 .


1
이제 50.1234와 같은 숫자를 처리해야하며 아래에 읽을 수있는 내 솔루션 버전이 있습니다! 그러나 나는 우리가 전체 패딩이 아니라 패딩 된 채로 있다고 가정했습니다.
coderjoe

7
값을 채울 때마다 새 배열을 만드는 팬이 아닙니다. 독자는이 중 #을 많이 수행하는 경우 잠재적 메모리 및 GC 영향에 대해 알고 있어야합니다 (예 : 초당 1000 번의 작업을 수행하는 node.js 서버에서 @profitehlolz의 답변이 더 나은 솔루션 인 것 같습니다. .)
broofa

6
zeroFill (-10, 7)-> "0000-10"
digitalbath

2
여기에 세 가지 주요 답변 중 성능 측정 : jsperf.com/left-zero-pad
tomsmeding

12
ECMAScript 2017부터 내장 기능 padStart가 있습니다.
Tomas Nikodym

321

간단한 방법. 패드에 문자열 곱셈을 추가하여 함수로 바꿀 수 있습니다.

var pad = "000000";
var n = '5';
var result = (pad+n).slice(-pad.length);

함수로서

function paddy(num, padlen, padchar) {
    var pad_char = typeof padchar !== 'undefined' ? padchar : '0';
    var pad = new Array(1 + padlen).join(pad_char);
    return (pad + num).slice(-pad.length);
}
var fu = paddy(14, 5); // 00014
var bar = paddy(2, 4, '#'); // ###2

95
이것은 내가 본 가장 좋은 해결책입니다. 명확성을 위해 다음은 시간 형식으로 분을 채우는 데 사용하는 간단한 버전입니다. ( '0'+ minutes) .slice (-2)
Luke Ehresman

17
이것은 while 루프를 사용하는 구현보다 5 배 느립니다 : gist.github.com/4382935
andrewrk

42
예상 수치보다 큰 치명적 결함 이 있습니다. 이는 매우 흔한 일입니다. 예를 들어, 필요 하지 않은 paddy (888, 2)수율 . 이 답변은 음수도 처리하지 않습니다. 88888
Brock Adams

8
@BrockAdams, zerofill은 일반적으로 고정 너비 숫자 / 서식 지정 사례에 사용되므로 2 자리 제로 채우기를 시도 할 때 3 자리 숫자가 주어지면 실제로 가능성이 적거나 문제가 아닌 것으로 생각합니다.
Seaux

1
( "000000"+ somenum) .substr (-6,6) 여기서 0의 수와 -6,6은 패드 너비에 해당합니다. 같은 생각이지만 슬라이스는 하나의 매개 변수를 덜 사용합니다. 슬라이스가 subtr보다 빠르거나 느린 지 확실하지 않습니다. 물론 내 솔루션에는 변수 할당이 필요하지 않습니다.
slartibartfast

315

나는 여기에 대한 모든 복잡한 대답을 믿을 수 없다 ... 그냥 이것을 사용하십시오 :

var zerofilled = ('0000'+n).slice(-4);

27
음수와 4 자리보다 긴 숫자를 제외하고는 좋습니다.
wberry

12
@ wberry 이것은 프로덕션 준비 코드가 아니라 실제 문제를 해결하기위한 기본 사항에 대한 간단한 설명입니다. 일명 숫자가 양수인지 음수인지를 결정하고 필요한 경우 적절한 부호를 추가하는 것이 매우 쉽습니다. 그래서 쉬운 예제를 클러스터하고 싶지 않았습니다. 또한 숫자 길이를 인수로 사용하여 하드 코딩 된 값 대신 사용하는 것이 쉽습니다.
Seaux

5
@Seaux는 "복잡한 답변을 모두 믿을 수 없다" 고 말한 후 자신에게 복잡성을 설명하기 시작했습니다. 이것은 당신이 당신의 대답이 완벽하지 않은 관점이 있다는 것을 이해한다는 것을 의미합니다. 따라서 복잡성.
옴 샨카

2
@OmShankar는 "복잡한 답변"으로 설명되거나 자세한 답변을 언급하지 않았으며 (이 답변은 그렇지 않은 경우에도이 사이트에서 권장되는 것이 아니라) 불필요한 코드 복잡성을 포함한 답변입니다.
Seaux

7
나는이 답변을 좋아한다. 필자의 경우에는 숫자가 항상 양수이고 3 자릿수를 넘지 않는다는 것을 알고 있습니다. 이것은 종종 0으로 채워지고 입력이 잘 알려진 경우입니다. 좋은!
Patrick Chu

110

나는 최근에 이와 비슷한 것을 생각해 내야했다. 루프를 사용하지 않고 할 수있는 방법이 있어야한다고 생각했습니다.

이것이 내가 생각해 낸 것입니다.

function zeroPad(num, numZeros) {
    var n = Math.abs(num);
    var zeros = Math.max(0, numZeros - Math.floor(n).toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( num < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

그런 다음 제로 패드에 숫자를 제공하여 사용하십시오.

> zeroPad(50,4);
"0050"

숫자가 패딩보다 크면 숫자가 패딩을 넘어 확장됩니다.

> zeroPad(51234, 3);
"51234"

소수도 괜찮습니다!

> zeroPad(51.1234, 4);
"0051.1234"

전역 네임 스페이스를 오염시키지 않아도 Number에 직접 추가 할 수 있습니다.

Number.prototype.leftZeroPad = function(numZeros) {
    var n = Math.abs(this);
    var zeros = Math.max(0, numZeros - Math.floor(n).toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( this < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

패딩에서 소수점 이하 자리를 차지하려면 다음과 같이하십시오.

Number.prototype.leftZeroPad = function(numZeros) {
    var n = Math.abs(this);
    var zeros = Math.max(0, numZeros - n.toString().length );
    var zeroString = Math.pow(10,zeros).toString().substr(1);
    if( this < 0 ) {
        zeroString = '-' + zeroString;
    }

    return zeroString+n;
}

건배!



XDR 은 더 나은 성능을 보이는 로그 변형 을 만들어 냈습니다 .

경고 :이 함수는 숫자가 0과 같은 경우 실패합니다 (예 : zeropad (0, 2))

function zeroPad (num, numZeros) {
    var an = Math.abs (num);
    var digitCount = 1 + Math.floor (Math.log (an) / Math.LN10);
    if (digitCount >= numZeros) {
        return num;
    }
    var zeroString = Math.pow (10, numZeros - digitCount).toString ().substr (1);
    return num < 0 ? '-' + zeroString + an : zeroString + an;
}

tomsmeding 은 성능에 대해 상위 3 개의 답변을 비교했습니다 ( 4는 로그 변형 ). 어느 쪽 이 다른 쪽을 크게 능가할까요? :)


9
이것은 좋으며 읽기 쉽고 강력합니다. 내가 바꿀 유일한 것은 numZeros매개 변수 의 이름입니다 . 오해의 소지가 있기 때문입니다. 추가하려는 0의 숫자가 아니라 숫자의 최소 길이입니다. 더 나은 이름은 numLength또는 것 length입니다.
Senseful

13
+1. 높은 투표 응답과 달리, 이것은 음수를 처리하고 오버플로시 총 오류를 반환하지 않습니다!?!
Brock Adams

10
여기에 세 가지 주요 답변 중 성능 측정 : jsperf.com/left-zero-pad
tomsmeding

4
로그를 사용하여이 답변의 성능을 100 % 이상 개선했습니다. http://jsperf.com/left-zero-pad/10
XDR

2
원래 솔루션이 더 좋습니다. num0이 될 수 있으면 로그 변형이 작동하지 않습니다 ...
Ondra C.

69

다음은 최대 7 자의 숫자를 채우는 데 사용한 것입니다.

("0000000" + number).slice(-7)

이 방법은 아마도 대부분의 사람들에게 충분할 것입니다.

편집 : 좀 더 일반적인 것으로 만들려면 다음을 수행하십시오.

("0".repeat(padding) + number).slice(-padding)

편집 2 : ES2017부터 다음을 사용할 수 있습니다 String.prototype.padStart.

number.toString().padStart(padding, "0")

큰 숫자와 음수에서는 잘못됩니다. number = 123456789예를 들어 위의 코드와 함께.
Brock Adams

이 솔루션은 특정 시나리오에 가장 적합합니다! 왜 우리가 전에 이것을 생각해 냈는지 전혀 알 수 없습니다. 시나리오는 다음과 같습니다. [Brock이 언급했듯이] 항상 긍정적 인 숫자가 있으며 한도보다 많은 문자를 사용하지 않습니다. 이 경우 Amazon SDB에 저장 한 점수가 있습니다. 아시다시피 SDB는 숫자를 비교할 수 없으므로 모든 점수는 0으로 채워 져야합니다. 이것은 매우 쉽고 효과적입니다!
Krystian

4
사과, 나는 이것이 음수로 작동하지 않을 것이라고 언급 했어야합니다. 그래도 더 일반적인 양수 사례를 다루고 있다고 생각합니다. 적어도 내가 필요한 일을합니다!
chetbox

이것을 다시 필요로하고 당신이 필요하지 않다는 것을 깨달았습니다 new String. 문자열 리터럴 만 사용할 수 있습니다.
chetbox

3
(new Array(padding + 1).join("0")다음으로 교체 가능"0".repeat(padding)
Pavel

34

최신 브라우저는 이제를 지원합니다. 이제 padStart간단하게 수행 할 수 있습니다.

string.padStart(maxLength, "0");

예:

string = "14";
maxLength = 5; // maxLength is the max string length, not max # of fills
res = string.padStart(maxLength, "0");
console.log(res); // prints "00014"


@Flimm은 답으로 자유롭게 편집하십시오 :) 그것은 4 년 전에 쓰여졌으므로 지금 상황이 바뀌었을 것입니다.
Sterling Archer

27

불행하게도,이 문제에 대한 복잡한 제안은 많지 않습니다. 일반적으로 수학이나 문자열 조작을위한 자신의 함수를 작성하거나 타사 유틸리티를 호출하는 것과 관련이 있습니다. 그러나 기본 JavaScript 라이브러리에는 한 줄의 코드만으로이 작업을 수행하는 표준 방법이 있습니다. 로컬 이름이나 스타일처럼 절대 변경하지 않으려는 매개 변수를 지정하지 않아도되도록 함수에이 한 줄의 코드를 래핑하는 것이 좋습니다.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumIntegerDigits: 3,
    useGrouping: false
});

텍스트에 대해 "005"값이 생성됩니다. Number의 toLocaleString 함수를 사용하여 소수점 오른쪽에 0을 채울 수도 있습니다.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumFractionDigits: 2,
    useGrouping: false
});

텍스트의 값이 "5.00"이됩니다. 수천에 쉼표 구분 기호를 사용하려면 useGrouping을 true로 변경하십시오.

toLocaleString()with localesoptionsarguments 사용 은 ECMAScript가 아니라 ECMA-402에서 개별적으로 표준화됩니다 . 현재 일부 브라우저 는 기본 지원 만 구현합니다 . 즉, toLocaleString()모든 인수를 무시할 수 있습니다.

완전한 예


와우, 이것은 매우 깨끗한 솔루션이며 node.js에서 작동합니다.
jishi

"필요한 복잡한 제안"이라는 소개를 읽을 때 나는 웃었다. 모든 엔지니어링 분야에서와 같이 소프트웨어 개발에는 균형을 유지해야합니다. 이 "표준 방식"을 직접 시도해보고 시간을 정했습니다. 확실히 작동하지만 다른 많은 "홈 롤"솔루션과 비교할 때 속도가 느리기 때문에 반복적 인 응용 프로그램에는 사용하지 않을 것입니다.
bearvarine

1
사실 많은 내장 JavaScript 함수는 많은 데이터를 반복 할 때 성능이 좋지 않지만 Node.js와 같은 서버 측에서도 JavaScript를 사용해서는 안된다고 주장합니다. 서버 측에서 처리 할 데이터가 많으면 .NET 또는 Java와 같은 더 나은 플랫폼을 사용해야합니다. 최종 사용자에게 표시하기 위해 클라이언트 측 데이터를 처리하는 경우 현재 최종 사용자 화면에 렌더링중인 데이터 만 처리해야합니다. 예를 들어, 표의 보이는 행만 렌더링하고 다른 도로의 데이터는 처리하지 마십시오.
Daniel Barbalace

21

채우기 번호가 미리 특정 값을 초과하지 않는 것으로 알려진 경우 루프없이이를 수행하는 다른 방법이 있습니다.

var fillZeroes = "00000000000000000000";  // max number of zero fill ever asked for in global

function zeroFill(number, width) {
    // make sure it's a string
    var input = number + "";  
    var prefix = "";
    if (input.charAt(0) === '-') {
        prefix = "-";
        input = input.slice(1);
        --width;
    }
    var fillAmt = Math.max(width - input.length, 0);
    return prefix + fillZeroes.slice(0, fillAmt) + input;
}

여기에서 테스트 사례 : http://jsfiddle.net/jfriend00/N87mZ/


@BrockAdams-두 경우 모두 고정. 숫자가 이미 채우기 너비만큼 넓 으면 채우기가 추가되지 않습니다.
jfriend00

감사; +1. 그러나 음수는 일반적인 규칙과 약간 다릅니다. 예를 들어 테스트 사례에서는 -88을 산출해야합니다 "-00088".
Brock Adams

1
@BrockAdams - 나는하지 호출인지 확실했다 zeroFill(-88, 5)생성한다 -00088-0088? width인수가 전체 너비 또는 소수 자릿수 인지 여부에 따라 달라집니다 (음수 부호 제외). 구현자는 --width코드 행을 제거하여 음수 부호를 포함하지 않도록 동작을 쉽게 전환 할 수 있습니다 .
jfriend00

19

빠르고 더러운 방법 :

y = (new Array(count + 1 - x.toString().length)).join('0') + x;

x = 5이고 count = 6 인 경우 y = "000005"입니다.


1
나는 y="0005"위와 함께, y = (new Array(count + 1 - x.toString().length)).join('0') + x;나에게 준 것입니다y="000005"
forforf

3
@OrrSiloni : 가장 짧은 코드 솔루션은 실제로('0000'+n).slice(-4)
Seaux

14

다음은 작업을 수행하기 위해 고안 한 빠른 기능입니다. 누구나 간단한 접근 방식을 가지고 있다면 자유롭게 공유하십시오!

function zerofill(number, length) {
    // Setup
    var result = number.toString();
    var pad = length - result.length;

    while(pad > 0) {
        result = '0' + result;
        pad--;
    }

    return result;
}

"더 간단한"솔루션이있을 것이라고 생각하지 않습니다. 항상 어떤 종류의 함수일 것입니다. 우리는 알고리즘 토론을 할 수 있지만, 결국에는 숫자를 0으로 채우는 함수가 끝납니다.
피터 베일리

내 일반적인 조언은 일반적으로 더 안정적이고 빠른 인 ECMAScript 언어로 (액션 1-3, 자바 스크립트)만큼 루프 "를"사용하는 것입니다
cwallenpoole

또는, 반복을 완전히 건너 뛰십시오;)
Peter Bailey

더 간단한 기능? 아마 아닙니다. 반복하지 않는 것? 알고리즘이 완전히 사소한 것은 아니지만 가능합니다.
coderjoe

1
와우, 위의 모든 주석이 잘못되었습니다. @profitehlolz의 솔루션은 더 간단하고 인라이닝에 적합합니다 (함수일 필요는 없습니다). 한편 for.vs. while: 성능은 흥미로운 일이 될 수있는 다른 것만으로는 충분하지 않습니다 jsperf.com/fors-vs-while/34
broofa

12

여기 파티에 늦었지만, 종종 n양의 소수로 알려진 일부 값의 임시 패딩을 수행하기 위해이 구성을 사용합니다 .

(offset + n + '').substr(1);

offset10 ^^ 자리는 어디 입니까?

예 : 패딩을 5 자리로, 여기서 n = 123 :

(1e5 + 123 + '').substr(1); // => 00123

이 16 진수 버전은 약간 더 장황합니다 :

(0x100000 + 0x123).toString(16).substr(1); // => 00123

참고 1 : @profitehlolz의 솔루션도 좋아합니다. 이것은 slice ()의 멋진 음수 색인 기능을 사용하는 문자열 버전입니다.


12

나는 왜 그런지 정말로 모른다. 그러나 아무도 가장 명백한 방법으로 그것을하지 않았다. 여기 내 구현입니다.

함수:

/** Pad a number with 0 on the left */
function zeroPad(number, digits) {
    var num = number+"";
    while(num.length < digits){
        num='0'+num;
    }
    return num;
}

원기:

Number.prototype.zeroPad=function(digits){
    var num=this+"";
    while(num.length < digits){
        num='0'+num;
    }
    return(num);
};

매우 간단합니다. 어떻게 이것이 더 간단 할 수 있는지 알 수 없습니다. 어떤 이유로 나는 여기에 여러 번 보였으므로 사람들은 어떤 비용 으로든 'for'및 'while'루프를 피하려고합니다. 정규식을 사용하면 사소한 8 자리 패딩에 더 많은 사이클이 필요할 것입니다.


11

이 스 니펫을 사용하여 5 자리 표시를 얻습니다.

(value+100000).toString().slice(-5) // "00123" with value=123


9

수학의 힘!

x = 패드까지의 정수
y = 패드까지의 제로 수

function zeroPad(x, y)
{
   y = Math.max(y-1,0);
   var n = (x / Math.pow(10,y)).toFixed(y);
   return n.replace('.','');  
}

9

String.prototype.substr () 을 사용할 때 아무도 사실을 지적하지 못했습니다.음수로 오른쪽부터 계산 .

OP의 질문에 대한 하나의 라이너 솔루션, 숫자 5로 채워진 6 자리 숫자는 다음과 같습니다.

console.log(("00000000" + 5).substr(-6));

우리가 얻을 수있는 일반화 :

function pad(num, len) { return ("00000000" + num).substr(-len) };

console.log(pad(5, 6));
console.log(pad(45, 6));
console.log(pad(345, 6));
console.log(pad(2345, 6));
console.log(pad(12345, 6));


8

이 질문에서 찾은 15 가지 기능 / 방법을 오랫동안 테스트 한 결과, 이제 가장 적합한 (가장 다재다능하고 빠른) 것을 알고 있습니다.

이 질문에 대한 답변에서 15 가지 기능 / 방법을 사용하여 100 개의 패드를 실행하는 데 걸리는 시간을 측정하는 스크립트를 만들었습니다. 각 패드는 숫자 92000 0 웁니다. 이것은 과도하게 보일 수 있지만 기능의 스케일링에 대한 좋은 아이디어를 제공합니다.

내가 사용한 코드는 여기에서 찾을 수 있습니다 : https://gist.github.com/NextToNothing/6325915

코드를 직접 수정하고 테스트하십시오.

가장 다양한 방법을 사용하려면 루프를 사용해야합니다. 다른 많은 사람들이 실패 할 가능성이 높지만 성공할 수 있기 때문입니다.

어떤 루프를 사용해야합니까? 글쎄, 그것은 while루프 일 것입니다. for루프는 빠른 아직이지만,while 루프는 약간 빨리 (석사의 커플) - 그리고 청소기.

에 의한 것과 같은 답변 Wilco, Aleksandar Toplek또는Vitim.us 완벽하게 일을 할 것입니다.

개인적으로 다른 접근법을 시도했습니다. 재귀 함수를 사용하여 문자열 / 숫자를 채우려 고했습니다. 배열을 조인하는 메소드보다 잘 작동했지만 여전히 for 루프만큼 빨리 작동하지 않았습니다.

내 기능은 다음과 같습니다

function pad(str, max, padder) {
  padder = typeof padder === "undefined" ? "0" : padder;
  return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}

패딩 변수를 설정하거나 설정하지 않고 내 기능을 사용할 수 있습니다. 이렇게 이렇게 :

pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'

개인적으로, 내 테스트 후, 내가 좋아하는, while 루프와 방법을 사용 Aleksandar Toplek하거나 Vitim.us. 그러나 패딩 문자열을 설정할 수 있도록 약간 수정합니다.

따라서이 코드를 사용합니다.

function padLeft(str, len, pad) {
    pad = typeof pad === "undefined" ? "0" : pad + "";
    str = str + "";
    while(str.length < len) {
        str = pad + str;
    }
    return str;
}

// Usage
padLeft(1, 3); // Returns '001'
// - Or -
padLeft(1, 3, "x"); // Returns 'xx1'

이 코드를 사용하여 프로토 타입 함수로 사용할 수도 있습니다.

Number.prototype.padLeft = function(len, pad) {
    pad = typeof pad === "undefined" ? "0" : pad + "";
    var str = this + "";
    while(str.length < len) {
        str = pad + str;
    }
    return str;
}

// Usage
var num = 1;

num.padLeft(3); // Returns '001'
// - Or -
num.padLeft(3, "x"); // Returns 'xx1'

나는 이것을 jsfiddle에 넣어 다른 사람들이 코드 버전을 추가하기 위해 신속하게 테스트 할 수 있도록합니다 : jsfiddle.net/kevinmicke/vnvghw7y/2 버전은 항상 매우 경쟁적이고 때로는 가장 빠릅니다. 철저한 테스트에 감사드립니다.
kevinmicke

8

첫 번째 매개 변수는 실수이고 두 번째 매개 변수는 소수점 왼쪽의 최소 자릿수를 지정하는 양의 정수이고 세 번째 매개 변수는 소수점 오른쪽의 자릿수를 지정하는 선택적 양의 정수입니다.

function zPad(n, l, r){
    return(a=String(n).match(/(^-?)(\d*)\.?(\d*)/))?a[1]+(Array(l).join(0)+a[2]).slice(-Math.max(l,a[2].length))+('undefined'!==typeof r?(0<r?'.':'')+(a[3]+Array(r+1).join(0)).slice(0,r):a[3]?'.'+a[3]:''):0
}

그래서

           zPad(6, 2) === '06'
          zPad(-6, 2) === '-06'
       zPad(600.2, 2) === '600.2'
        zPad(-600, 2) === '-600'
         zPad(6.2, 3) === '006.2'
        zPad(-6.2, 3) === '-006.2'
      zPad(6.2, 3, 0) === '006'
        zPad(6, 2, 3) === '06.000'
    zPad(600.2, 2, 3) === '600.200'
zPad(-600.1499, 2, 3) === '-600.149'


8

이것이 ES6 솔루션입니다.

function pad(num, len) {
  return '0'.repeat(len - num.toString().length) + num;
}
alert(pad(1234,6));


분명히 가장 우아한 해결책은 그냥 2 문자열 변환을 피하기 위해 수정 것입니다 : const numStr = String(num)return '0'.repeat(len - numStr.length) + numStr;
ngryman

8

모든 최신 브라우저에서 사용할 수 있습니다

numberStr.padStart(numberLength, "0");

function zeroFill(num, numLength) {
  var numberStr = num.toString();

  return numberStr.padStart(numLength, "0");
}

var numbers = [0, 1, 12, 123, 1234, 12345];

numbers.forEach(
  function(num) {
    var numString = num.toString();
    
    var paddedNum = zeroFill(numString, 5);

    console.log(paddedNum);
  }
);

다음은 MDN 참조입니다 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart


5

이 질문에 더 많은 답변이 필요하다는 것은 아니지만 간단한 lodash 버전을 추가 할 것이라고 생각했습니다.

_.padLeft(number, 6, '0')


1
더 나은 :var zfill = _.partialRight(_.padStart, '0');
Droogans

3
: 어떤 사람들은 아마 "내가 사용 lodash 싶지 않아"하지만 당신은이 기능을 설치할 수 있기 때문에 그것은 더 이상 거의 유효한 인수 없습니다 항의합니다 npm install --save lodash.padleft다음, import padLeft from 'lodash.padleft'및 생략_.
앤디

5

가장 최신 방법은 다음과 같습니다.

var number = 2
number.toLocaleString(undefined, {minimumIntegerDigits:2})

output: "02"


(8).toLocaleString(undefined, {minimumIntegerDigits: 5})"00.008"내 로케일에 따라 나에게 돌아갑니다 .
le_m


4

이것은 네이티브가 아니지만 가장 빠를 수도 있습니다 ...

zeroPad = function (num, count) {
    var pad = (num + '').length - count;
    while(--pad > -1) {
        num = '0' + num;
    }
    return num;
};

당신이하고 싶은 것 같아요 pad = count - (num + '').length. 음수는 잘 처리되지 않지만 그 외에는 나쁘지 않습니다. +1
nickf

3

내 솔루션

Number.prototype.PadLeft = function (length, digit) {
    var str = '' + this;
    while (str.length < length) {
        str = (digit || '0') + str;
    }
    return str;
};

용법

var a = 567.25;
a.PadLeft(10); // 0000567.25

var b = 567.25;
b.PadLeft(20, '2'); // 22222222222222567.25

3

왜 재귀를 사용하지 않습니까?

function padZero(s, n) {
    s = s.toString(); // in case someone passes a number
    return s.length >= n ? s : padZero('0' + s, n);
}

padZero (223, 3)가 '0223'으로 실패
Serginho

글쎄, 나는이 함수가 첫 번째 매개 변수로 문자열로 호출되었다고 가정했습니다. 그러나 나는 그것을 고쳤다.
lex82

2

일부 몽키 패칭도 작동합니다

String.prototype.padLeft = function (n, c) {
  if (isNaN(n))
    return null;
  c = c || "0";
  return (new Array(n).join(c).substring(0, this.length-n)) + this; 
};
var paddedValue = "123".padLeft(6); // returns "000123"
var otherPadded = "TEXT".padLeft(8, " "); // returns "    TEXT"

1
자바 스크립트에서 최상위 네임 스페이스를 원숭이 패치하는 것은 나쁜 습관입니다.
Jeremy Wall

2
객체 및 배열 객체에 대해서는 맞지만 문자열은 나쁘지 않습니다
Rodrigo

2
function pad(toPad, padChar, length){
    return (String(toPad).length < length)
        ? new Array(length - String(toPad).length + 1).join(padChar) + String(toPad)
        : toPad;
}

pad(5, 0, 6) = 000005

pad('10', 0, 2) = 10 // don't pad if not necessary

pad('S', 'O', 2) = SO

...기타.

건배


나는 그것이 더 같아야한다고 생각합니다 : var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;당신이 그것을 고치면 내 투표를 제거 할 것입니다.
drewish

@drewish 이해해 주셔서 감사합니다. 편집 내용에 동의합니다 (하드 코딩 된 0조인 char 제외) .-답변이 업데이트되었습니다.
Madbreaks

문자열을 임시 변수에 저장하는 것이 좋습니다. 나는 jsperf.com/padding-with-memoization 이라는 벤치마킹을했다. "new Array"에 새로운 것을 사용하기위한 벤치 마크도있다.
drewish

2

간단한 찾을 것, 가장 솔직 솔루션입니다.

function zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.