589

JavaScript では、パディングが必要です。

たとえば、私が 9 という数字を持っている場合、それは「0009」になります。数が10なら「0010」です。常に 4 桁になることに注意してください。

これを行う 1 つの方法は、数値から 4 を引いて、配置する必要がある 0 の数を取得することです。

これを行うためのより滑らかな方法はありますか?

4

9 に答える 9

756

ES2017 アップデート

組み込みのString.prototype.padStart()を使用できます

n = 9;
String(n).padStart(4, '0'); // '0009'

n = 10;
String(n).padStart(4, '0'); // '0010'

これまでのところ、多くの「巧妙な」作業は行われていません:

function pad(n, width, z) {
  z = z || '0';
  n = n + '';
  return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
}

配列を数値で初期化すると、配列にその数の要素lengthが含まれているように見えるように、その値に設定された配列が作成されます。undefined一部の Array インスタンス メソッドは、値のない配列要素をスキップしますが、スキップ.join()しないか、少なくとも完全にはスキップしません。それらの値が空の文字列であるかのように扱います。したがって、各配列要素の間にゼロ文字 (または「z」が何であれ) のコピーを取得します。が入っているのはそのため+ 1です。

使用例:

pad(10, 4);      // 0010
pad(9, 4);       // 0009
pad(123, 4);     // 0123

pad(10, 4, '-'); // --10
于 2012-04-09T13:18:28.563 に答える
277
function padToFour(number) {
  if (number<=9999) { number = ("000"+number).slice(-4); }
  return number;
}

そんな感じ?

おまけに、理解できないが滑らかな単一行の ES6 バージョン:

let padToFour = number => number <= 9999 ? `000${number}`.slice(-4) : number;

ES6主義:

  • letvarブロック スコープの変数です (の関数スコープとは対照的に)
  • =>とりわけfunction、そのパラメータを置き換えて先頭に追加するアロー関数です
  • アロー関数が 1 つのパラメーターを取る場合は、括弧を省略できます (したがってnumber =>)
  • アロー関数本体に で始まる単一行がある場合return、中括弧とreturnキーワードを省略して、単に式を使用できます
  • 関数本体を 1 行にまとめるために、だまされて三項式を使用しました
于 2012-04-09T13:16:22.400 に答える
234

試す:

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}

今テスト:

var str = "5";
alert(str.lpad("0", 4)); //result "0005"
var str = "10"; // note this is string type
alert(str.lpad("0", 4)); //result "0010"

DEMO


ECMAScript 2017には、 以下の構文を持つ新しいメソッドpadStartと があります。padEnd

"string".padStart(targetLength [,padString]):

だから今、私たちは使用することができます

const str = "5";
str.padStart(4, "0"); // "0005"
于 2012-04-09T13:13:47.633 に答える
70

おかしい、私は最近これをしなければなりませんでした。

function padDigits(number, digits) {
    return Array(Math.max(digits - String(number).length + 1, 0)).join(0) + number;
}

次のように使用します。

padDigits(9, 4);  // "0009"
padDigits(10, 4); // "0010"
padDigits(15000, 4); // "15000"

美しくはありませんが、効果的です。

于 2012-04-09T15:35:27.383 に答える
15

あなたはこのようなことをすることができます:

function pad ( num, size ) {
  return ( Math.pow( 10, size ) + ~~num ).toString().substring( 1 );
}

編集:これは関数の基本的な考え方でしたが、より大きな数(および無効な入力)のサポートを追加するには、おそらくこれがより良いでしょう:

function pad ( num, size ) {
  if (num.toString().length >= size) return num;
  return ( Math.pow( 10, size ) + Math.floor(num) ).toString().substring( 1 );
}

これは2つのことを行います:

  1. 数値が指定されたサイズよりも大きい場合は、単に数値を返します。
  2. Math.floor(num)の代わりに使用すると、~~numより多くの数がサポートされます。
于 2012-04-09T13:50:15.880 に答える
3

これは実際には「巧妙」ではありませんが、パディングごとに文字列連結を行うよりも整数演算を行う方が高速です0

function ZeroPadNumber ( nValue )
{
    if ( nValue < 10 )
    {
        return ( '000' + nValue.toString () );
    }
    else if ( nValue < 100 )
    {
        return ( '00' + nValue.toString () );
    }
    else if ( nValue < 1000 )
    {
        return ( '0' + nValue.toString () );
    }
    else
    {
        return ( nValue );
    }
}

この関数は、特定のニーズ (4 桁のパディング) に合わせてハードコードされているため、一般的ではありません。

于 2012-04-09T13:19:01.450 に答える
3

楽しみのために、ループを使用して余分なゼロを作成する代わりに:

function zeroPad(n,length){
  var s=n+"",needed=length-s.length;
  if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
  return s;
}
于 2012-04-09T13:19:38.893 に答える