JavaScriptでは、パディングが必要です。
たとえば、9という数字があれば、 "0009"になります。私が10と言う数があれば、それは "0010"になります。それが常に4桁を含むことに注意してください。
これをする1つの方法は私が置く必要がある0の数を得るためにマイナス4を引くことです。
これを行うのに巧妙な方法はありましたか?
これまでのところ「スリック」なことは多くありません。
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
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
キーワードを省略して単純に式を使用できます。試してください:
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"
ECMAScript 8 では、以下の構文を持つ新しいメソッド padStart
および padEnd
があります。
'string'.padStart(targetLength [、padString]):
だから今私たちは使用することができます
const str = "5";
str.padStart(4, '0'); // '0005'
おかしい、私は最近これをしなければならなかった。
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"
美しくないが効果的。
あなたは数があると言った
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);
}
あなたはこのようなことをすることができます:
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つのことを行います:
~~num
の代わりにMath.floor(num)
を使用すると、より大きな数をサポートします。ループを使用して余分なゼロを作成するのではなく、お楽しみください。
function zeroPad(n,length){
var s=n+"",needed=length-s.length;
if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
return s;
}
あなたはそれが常に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/ /
これは実際には滑らかではありませんが、パディング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桁のパディング)にハードコードされているので、一般的なものではありません。