문제

JavaScript에서 값을 Zerofill에 권장하는 방법은 무엇입니까? 제로를 타입 캐스트 값으로 만들기 위해 사용자 지정 기능을 구축 할 수 있다고 생각하지만 더 직접적인 방법이 있는지 궁금합니다.

메모: "Zerofilled"라는 단어는 단어의 데이터베이스 의미에서 그것을 의미합니다 (숫자 5의 6 자리 zerofilled 표현은 "000005").

도움이 되었습니까?

해결책

독자들에게 메모!

의견 제시 자들이 지적 했듯이이 솔루션은 "영리한"이며, 영리한 솔루션이 종종 있기 때문에 메모리 집약적이고 비교적 느립니다. 성능이 당신에게 관심이 있다면이 솔루션을 사용하지 마십시오!

잠재적으로 구식: ecmascript 2017 포함 string.prototype.padstart 그리고 번호 .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의 확장.

다른 팁

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

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

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

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

나는 실제로 최근에 이와 같은 것을 생각해 내야했다. 나는 루프를 사용하지 않고 그것을 할 수있는 방법이 있어야한다고 생각했다.

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

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.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 함께했다 로그 변형 더 잘 수행되는 것 같습니다.

경고: Num이 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 로그 변형으로). 어느 쪽을 맞춰보세요 주로 outperformed the other two? :)

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

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

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

편집 : 더 일반적인 것으로 만들려면 다음을 수행 할 수 있습니다.

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

편집 2 : ES2017 이후로 사용할 수 있습니다. String.prototype.padStart:

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

var amount = 5;

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

이것은 텍스트에 대해 "005"의 값을 생성합니다. 숫자의 Tolocalestring 함수를 사용하여 10 진수 지점의 오른쪽에 0을 패드 할 수 있습니다.

var amount = 5;

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

이것은 텍스트의 "5.00"값을 생성합니다. 수천 마리의 쉼표 분리기를 사용하기 위해 사용 그룹을 true로 변경하십시오.

사용하십시오 toLocaleString() ~와 함께 locales 그리고 options 논쟁 ECMA-402에서 별도로 표준화됩니다, ecmascript가 아닙니다. 오늘 현재 일부 브라우저 기본 지원 만 구현하십시오, 즉 toLocaleString() 주장을 무시할 수 있습니다.

완전한 예

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

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/

제안 된 (3 단계) ES2017 방법에서 .padStart() 이제 간단히 할 수 있습니다 (구현/지원 될 때) :

string.padStart(maxLength, "0"); //max length is the max string length, not max # of fills

빠르고 더러운 방법 :

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

x = 5, count = 6의 경우 y = "000005"가 있습니다.

다음은 제가 일을하기 위해 생각해 낸 빠른 기능입니다. 누군가가 더 간단한 접근 방식을 가지고 있다면 자유롭게 공유하십시오!

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

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

    return result;
}

여기 파티에 늦었지만, 나는 종종이 구성물을 사용하여 일부 가치의 임시 패딩을 수행합니다. n, 긍정적이고 소수점으로 알려져 있습니다.

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

어디에 offset 10 ^^ 자리입니다.

예를 들어 5 자리로 패딩, 여기서 n = 123 :

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

이것의 16 진 버전은 약간 더 장점입니다.

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

참고 1 : @profitehlolz의 솔루션도 좋아합니다. Slice ()의 Nifty Negative-Index 기능을 사용하여 이것의 문자열 버전입니다.

나는 왜 그런지 모르겠지만 아무도 가장 명백한 방식으로 그것을하지 않았습니다. 여기 내 구현입니다.

기능:

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

나는이 snipet을 사용하여 5 자리 숫자 표현을 얻습니다.

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

수학의 힘!

x = 패드에 대한 정수
y = 패드 할 0의 수

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

ECMAScript 2017 : 사용 Padstart 또는 Padend

'abc'.padStart(10);         // "       abc"
'abc'.padStart(10, "foo");  // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"

더 많은 정보:

아무도 보지 못했습니다. String.prototype.substr () 음수로 오른쪽에서 계산됩니다.

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

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'

바퀴를 재발 명하지 마십시오 밑줄 문자열:

jsfiddle

var numToPad = '5';

alert(_.str.pad(numToPad, 6, '0')); // yields: '000005'

이것은 ES6 솔루션입니다.

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

9 ~와 함께 2000 0. 이것은 과도하게 보일 수 있지만 기능의 스케일링에 대한 좋은 아이디어를 제공합니다.

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

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

그렇다면 어떤 루프를 사용해야합니까? 글쎄, 그게 될 것입니다 while 고리. ㅏ for 루프는 여전히 빠르지 만 a while 루프는 약간 더 빠르며 (두 MS) - 클리너입니다.

그와 같은 대답 Wilco, Aleksandar Toplek 또는 Vitim.us 일을 완벽하게 할 것입니다.

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'

모든 현대식 브라우저에서 사용할 수 있습니다

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

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

이 작업을 수행하는 최신 방법은 훨씬 간단합니다.

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

output: "02"

또 다른 해결책이지만 더 읽기 쉬운 것 같습니다.

function zeroFill(text, size)
{
  while (text.length < size){
  	text = "0" + text;
  }
  
  return text;
}

이것은 덜 기본이지만 가장 빠를 수도 있습니다 ...

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

내 해결책

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

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

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

일부 monkeypatching도 작동합니다

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"
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

...등.

건배

그만큼 가장 간단합니다,

function zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top