web-dev-qa-db-ja.com

JavaScriptで先頭にゼロを付ける

可能な重複:
JavaScriptを使用してZerofilled値を作成する方法を教えてください。

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

たとえば、9という数字があれば、 "0009"になります。私が10と言う数があれば、それは "0010"になります。それが常に4桁を含むことに注意してください。

これをする1つの方法は私が置く必要がある0の数を得るためにマイナス4を引くことです。

これを行うのに巧妙な方法はありましたか?

384
Nate Pet

これまでのところ「スリック」なことは多くありません。

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
557
Pointy
function padToFour(number) {
  if (number<=9999) { number = ("000"+number).slice(-4); }
  return number;
}

そんな感じ?

わかりやすいが、スリックなシングルラインES6バージョン:

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

ES6ism:

  • letはブロックスコープの変数です(varの関数スコープとは対照的に)
  • =>は、とりわけfunctionを置き換え、そのパラメーターが前に付いている矢印関数です。
  • 矢印関数が単一のパラメーターを取る場合は、括弧を省略することができます(したがってnumber =>
  • 矢印関数本体にreturnで始まる単一行がある場合は、中括弧とreturnキーワードを省略して単純に式を使用できます。
  • 関数本体を単一行にするために、私はだまして三項式を使いました
224

試してください:

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 8 では、以下の構文を持つ新しいメソッド padStart および padEnd があります。

'string'.padStart(targetLength [、padString]):

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

const str = "5";
str.padStart(4, '0'); // '0005'
125
diEcho

おかしい、私は最近これをしなければならなかった。

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"

美しくないが効果的。

60
Peter C

あなたは数があると言った

String.prototype.padZero= function(len, c){
    var s= '', c= c || '0', len= (len || 2)-this.length;
    while(s.length<len) s+= c;
    return s+this;
}
Number.prototype.padZero= function(len, c){
    return String(this).padZero(len,c);
}
23
kennebec

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

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. ~~numの代わりにMath.floor(num)を使用すると、より大きな数をサポートします。
12
Robert Messerle

ループを使用して余分なゼロを作成するのではなく、お楽しみください。

function zeroPad(n,length){
  var s=n+"",needed=length-s.length;
  if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
  return s;
}
3
Phrogz

あなたはそれが常に4の長さを持つことになっていると述べたので、私はこの滑らかにするために少しのエラーチェックもしないでしょう。 ;)

function pad(input) {
    var BASE = "0000";
    return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
}

アイデア:単に '0000'を与えられた数字に置き換えてください。それで問題は、inputが0の場合、 '0000'を返すようにハードコードする必要があるということです。笑。

これは十分なめらかなはずです。

JSFiddler: http://jsfiddle.net/Up5Cr/ /

2
DashK

これは実際には滑らかではありませんが、パディング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桁のパディング)にハードコードされているので、一般的なものではありません。

2
xxbbcc