値に先行ゼロを埋め込むにはどうすればよいですか?


395

JavaScriptで値をゼロフィルするための推奨される方法は何ですか?型キャストされた値にゼロを埋め込むカスタム関数を構築できると思いますが、これを行う直接的な方法があるかどうか疑問に思いますか?

注:「ゼロフィル」とは、データベースの意味での意味です(5の6桁のゼロフィル表現は「000005」になります)。


これは答えるのに十分な情報ではありません。「ゼロパディング」の最も一般的な例は、おそらく日付の前にゼロを付加することでしょう:5/1/2008> 05/01/2008。そういう意味ですか
トリプティク

6
ノードのアプリ、使用する場合npm install sprintf-js:、あなたが必要とするファイルでそれを必要とするsprintf('%0d6', 5);
Droogans

function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;} ... n否定的ではないと仮定
パオロ

@Paolo nが数値の場合、この関数は機能しません。whileアクセスするには、前にnを文字列に変換する必要がありますn.length
Nick F

1
MathまたはWhileループまたはライブラリのない1つのライナー?mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Adam Whateverson

回答:


226

読者への注意!

コメンターが指摘したように、このソリューションは「賢い」ものであり、賢いソリューションはしばしばそうであるように、メモリを集中的に使用し、比較的低速です。パフォーマンスが気になる場合は、このソリューションを使用しないでください。

潜在的に古い:ECMAScriptの2017は、 String.prototype.padStart Number.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のextendと同様です。


1
これで、50.1234のような数値を処理するだけで済み、以下の私の解読可能なバージョンが手に入ります。ただし、全体的なパディングではなく、左パディングであると想定しました。
coderjoe 2009

7
値を埋め込むたびに新しい配列を作成するファンではありません。読者は、これらの大きな数を実行している場合(たとえば、1秒あたり数千回のこれらの操作を実行しているnode.jsサーバーで)、潜在的なメモリとGCへの影響に注意する必要があります。@ profitehlolzの答えがより良い解決策のようです。)
broofa 2012

6
これは負の値では機能しません:zeroFill(-10、7)-> "0000-10"
digitalbath

2
トップ3の回答のうち、ここでのパフォーマンス測定:jsperf.com/left-zero-pad
tomsmeding

12
ECMAScript 2017の時点で、組み込み関数padStartがあります。
Tomas Nikodym 2016

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
andrewrk

42
これには、予想よりも大きい致命的な欠陥があります。これは非常に一般的なことです。たとえば、paddy (888, 2)利回り88であり888、必要ではありません。この回答も負の数を処理しません。
ブロックアダムス

8
@ BrockAdams、zerofillは通常、固定幅の数値/フォーマットの場合に使用されます。したがって、2桁のゼロフィルを行おうとするときに3桁の数値が与えられた場合、実際には(または問題ではなく)可能性は低いと思います。
Seaux

1
( "000000" + somenum).substr(-6,6)ここで、ゼロの数と-6,6はパッドの幅に対応します。アイデアは同じですが、スライスのパラメータは1つ少なくなります。スライスがsubtrより速いか遅いかわからない。もちろん、私の解決策は変数の割り当てを必要としません。
slartibartfast 2014年

315

ここにあるすべての複雑な答えは信じられません...これを使用してください:

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

27
負の数と4桁より長い数を除いて良い。
wberry '19

12
@wberryこれは本番用のコードを意図したものではなく、問題を解決するための基本についてのより簡単な説明です。別名数値が正か負かを判断し、必要に応じて適切な符号を追加するのは非常に簡単なので、簡単な例をそれとクラスタリングしたくありませんでした。また、数字の長さを引数として取り、ハードコードされた値の代わりにそれを使用する関数を作成するのも同じくらい簡単です。
Seaux

5
@Seaux、あなたは言った:「すべての複雑な答えを信じることはできない」そしてそれからコメントされたときに自分にその複雑さを説明し始めた。これは、答えが完全ではない視点があることを理解していることを意味します。したがって、複雑さ。
Om Shankar

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は、パフォーマンスが向上しているように見える対数変動を考え出しました。

警告:numがゼロの場合、この関数は失敗します(例: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は対数変動と比較)。どちらが他の2 つを大幅に上回ったと思いますか?:)


9
これは良いです。読みやすく堅牢な方法が好きです。numZeros誤解を招く可能性があるので、変更するのはパラメーターの名前だけです。これは、追加するゼロの数ではなく、数の最小長です。より良い名前はnumLengthまたはlengthです。
2012年

13
+1。投票数の多い回答とは異なり、これは負の数を処理し、オーバーフロー時に重大なエラーを返しません!!?!
ブロックアダムス

10
ここでの上位3つの回答の中でのパフォーマンス測定:jsperf.com/left-zero-pad
tomsmeding

4
対数を使用して、この回答のパフォーマンスを100%以上改善しました。http://jsperf.com/left-zero-pad/10
XDR

2
元のソリューションの方が優れており、numゼロになる可能性がある場合、対数変動は機能しません...
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たとえば、上記のコードを使用します。
ブロックアダムス

このソリューションは、特定のシナリオでこれまでで最高のソリューションです。以前にこれを思い付かなかった理由がわかりません。シナリオは次のとおりです:[ブロックが言及したように]常に正の数があり、制限より多くの文字を使用しないことがわかっています。この場合、Amazon SDBに保存するスコアがあります。ご存じのとおり、SDBは数値を比較できないため、すべてのスコアにゼロを埋め込む必要があります。これは非常に簡単で効果的です!
2013年

4
申し訳ありませんが、これは負の数に対しては機能しません。ただし、これはより一般的な正数のケースを扱っていると思います。少なくとも私が必要としていることを実行します!
chetbox 2013年

もう一度これが必要で、必要ないことに気づきましたnew String。文字列リテラルのみを使用できます。
chetbox 2016年

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ライブラリの標準的な方法は、1行のコードだけです。ローカル名やスタイルなど、変更したくないパラメーターを指定する必要がないように、この1行のコードを関数にラップすることをお勧めします。

var amount = 5;

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

これにより、テキストの値は「005」になります。NumberのtoLocaleString関数を使用して、小数点の右側にゼロを埋め込むこともできます。

var amount = 5;

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

これにより、テキストの値は「5.00」になります。何千ものカンマ区切りを使用するには、useGroupingをtrueに変更します。

toLocaleString()with localesoptions引数の使用は、ECMAScriptではなくECMA-402個別に標準化されていることに注意してください。現在のところ、一部のブラウザは基本的なサポートのみを実装していtoLocaleString()ます。つまり、引数を無視する場合があります。

完全な例


うわー、これは非常にクリーンなソリューションであり、node.jsで動作します。
jishi 2016

イントロを読んだとき、私はくすくす笑いました-「不必要に複雑な提案」。すべてのエンジニアリング分野と同様に、ソフトウェア開発にはトレードオフの比較検討が含まれます。私はこの「標準的な方法」を自分で試してみました。それは間違いなく機能しますが、他の多くの「ホームロール」ソリューションと比較して速度が遅いため、あらゆる種類の繰り返しアプリケーションに使用することは決してありません。
ベアバリン2017

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 2013年

ありがとう。+1。ただし、負の数は通常の規則から少しずれています。たとえば、テストケースで-88は、が生成さ"-00088"れます。
ブロックアダムス

1
@BrockAdams-呼び出しzeroFill(-88, 5)が生成する必要があるかどうかわかりませんでした-00088-0088width引数を数値の幅全体にするか、桁数だけにするか(負の符号を含まない)によって異なると思います。実装者は--width、コード行を削除するだけで、負の符号を含まないように動作を簡単に切り替えることができます。
jfriend00 2013年

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

「より簡単な」解決策があるとは思いません-それは常にある種の機能になるでしょう。アルゴリズムについて議論することもできますが、結局のところ、数値をゼロで埋める関数ができあがります。
Peter Bailey、

私の一般的なアドバイスは、ECMAScript言語(ActionScript 1-3、およびJavaScript)で一般的により高速で安定している "for"ループを使用することです
cwallenpoole

または、反復を完全にスキップします;)
ピーターベイリー

シンプルな機能?おそらく違います。ループしないもの?それは可能です...アルゴリズムは完全に簡単ではありません。
coderjoe 2009

1
うわー、上記のコメントのほとんどすべてが正しくありません。@profitehlolzのソリューションはよりシンプルでインライン化に適しています(関数である必要はありません)。一方、for.vs。whileパフォーマンスはそれほど興味深いものではありません:jsperf.com/fors-vs-while/34
broofa

12

ここではパーティーに遅れますが、私はしばしばこの構成を使用してn、正の10進数であることがわかっている、ある値のアドホックパディングを実行します。

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

offset10 ^^桁はどこですか。

たとえば、n = 123である5桁のパディング:

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

非常に簡単ですが、これがどのように単純になるかはわかりません。どういうわけか私はここSOで何度も見たことがありますが、人々は「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の質問に対する1つのライナーの解決策、数値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ゼロで埋めます。これは過度に見えるかもしれませんが、実際はそうですが、関数のスケーリングについての良い考えを与えてくれます。

私が使用したコードはここにあります:https : //gist.github.com/NextToNothing/6325915

自由にコードを変更してテストしてください。

最も用途の広いメソッドを取得するには、ループを使用する必要があります。これは、非常に多数の場合、他のユーザーは失敗する可能性が高いためですが、これは成功します。

では、どのループを使用するのでしょうか。まあ、それはwhileループになります。forループが速く、まだですが、whileループはわずかに速く(ミリ秒のカップル)である-とクリーナー。

のような回答WilcoAleksandar 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;
}

パディング変数を設定してもしなくても、my関数を使用できます。このように:

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

個人的には、テスト後、Aleksandar Toplekまたはのような、whileループを持つメソッドを使用します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

最初のパラメーターは任意の実数、2番目のパラメーターは小数点の左側の最小桁数を指定する正の整数、3番目のパラメーターは小数点の右側の桁数を指定するオプションの正の整数です。

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

この質問にはもっと回答が必要なわけではありませんが、私はこれの単純なロダッシュバージョンを追加すると思いました。

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


1
より良い:var zfill = _.partialRight(_.padStart, '0');
Droogans

3
一部の人々はおそらく「私はlodashを使いたくない」と抗議しますがnpm install --save lodash.padleft、この関数のみをインストールできるので、もはや有効な引数ではありません。そしてimport padLeft from 'lodash.padleft'、省略します_.
Andy

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
ニックフ2009

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
-1 JavaScriptでトップレベルのネームスペースにサルパッチを適用することは悪い習慣です。
ジェレミーウォール

2
ObjectオブジェクトとArrayオブジェクトは真ですが、文字列は悪くありません
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それをキャッチしてくれてありがとう、私はあなたの編集に同意します(ハードコードされた0join char を除いて:)-回答が更新されました。
Madbreaks、2012年

文字列を一時変数に格納する方が良いと思います。ここでいくつかのベンチマークを行いました:jsperf.com/padding-with-memoization新しい「新しい配列」を使用するためのベンチマークもあり、newの結果はあちこちにありますが、memiozationはうまくいくようです。
12

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.