繁体   English   中英

如何用前导零填充值?

[英]How can I pad a value with leading zeros?

在 JavaScript 中零填充值的推荐方法是什么? 我想我可以构建一个自定义 function 来将零填充到类型转换的值上,但我想知道是否有更直接的方法可以做到这一点?

注意: “填零”是指数据库意义上的单词(其中数字 5 的 6 位填零表示为“000005”)。

我无法相信这里所有复杂的答案......只需使用这个:

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

 let n = 1 var zerofilled = ('0000'+n).slice(-4); console.log(zerofilled)

简单的方法。 您可以为 pad 添加字符串乘法并将其转换为函数。

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

从 ECMAScript 2017 开始,我们有了padStart

 const padded = (.1 + "").padStart(6, "0"); console.log(`-${padded}`);

在 ECMAScript 2017 之前

使用toLocaleString

 var n=-0.1; var res = n.toLocaleString('en', {minimumIntegerDigits:4,minimumFractionDigits:2,useGrouping:false}); console.log(res);

实际上,我最近不得不想出类似的东西。 我认为必须有一种方法可以在不使用循环的情况下做到这一点。

这就是我想出的。

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 等于 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 个与对数变化)。 猜猜哪一个大大优于其他两个? :)

这是我用来填充最多 7 个字符的数字。

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

对于大多数人来说,这种方法可能就足够了。

编辑:如果你想让它更通用,你可以这样做:

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

编辑 2:请注意,从 ES2017 开始,您可以使用String.prototype.padStart

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

现代浏览器现在支持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" number = 14; maxLength = 5; // maxLength is the max string length, not max # of fills res = number.toString().padStart(maxLength, "0"); console.log(res); // prints "00014"

不幸的是,对于这个问题有很多不必要的复杂建议,通常涉及编写自己的函数来进行数学或字符串操作或调用第三方实用程序。 但是,在基础 JavaScript 库中有一种标准方法,只需一行代码即可。 可能值得将这一行代码包装在一个函数中,以避免必须指定您永远不想更改的参数,例如本地名称或样式。

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 以使用千位逗号分隔符。

请注意,使用带有localesoptions参数的toLocaleString()在 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/

快速而肮脏的方式:

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

ECMAScript 2017:使用padStartpadEnd

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

更多信息:

在这里聚会迟到了,但我经常使用这个结构来做一些值n的临时填充,已知是一个正的小数:

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

其中offset为 10^^ 位。

例如填充到 5 位,其中 n = 123:

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

这个的十六进制版本稍微冗长一些:

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

注 1:我也喜欢 @profitehlolz 的解决方案,这是它的字符串版本,使用 slice() 的漂亮的负索引功能。

我真的不知道为什么,但没有人以最明显的方式做到这一点。 这是我的实现。

功能:

/** 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 位填充,使用正则表达式可能会花费更多的周期。

我使用这个片段来获得 5 位数字表示

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

在所有现代浏览器中,您都可以使用

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

数学的力量!

x = 要填充的整数
y = 要填充的零数

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

不要重新发明轮子,使用下划线字符串

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

并不是说这个问题需要更多答案,但我想我会添加这个简单的 lodash 版本。

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

我没有看到有人指出这样一个事实,即当您使用带负数的String.prototype.substr()时,它从右侧开始计数。

OP 问题的一个线性解决方案,即数字 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));

在对这个问题答案中找到的 15 种不同的功能/方法进行了很长时间的测试之后,我现在知道哪个是最好的(最通用和最快的)。

我从这个问题的答案中提取了 15 个函数/方法,并制作了一个脚本来测量执行 100 个焊盘所需的时间。 每个垫将用2000个零填充数字9 这可能看起来有些过分,确实如此,但它让您对函数的缩放有一个很好的了解。

我使用的代码可以在这里找到: https ://gist.github.com/NextToNothing/6325915

随意修改和测试代码。

为了获得最通用的方法,您必须使用循环。 这是因为如果数量非常多,其他人可能会失败,而这会成功。

那么,使用哪个循环? 好吧,那将是一个while循环。 for循环仍然很快,但while循环稍微快一点(几毫秒)——而且更干净。

WilcoAleksandar ToplekVitim.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;
}

您可以使用我的函数来设置或不设置填充变量。 所以像这样:

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

就个人而言,在我的测试之后,我会使用带有 while 循环的方法,比如Aleksandar ToplekVitim.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'

第一个参数是任何实数,第二个参数是一个正整数,指定小数点左边的最小位数,第三个参数是一个可选的正整数,指定小数点右边的位数。

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'

执行此操作的最新方法要简单得多:

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

使用 ES6+ JavaScript:

您可以使用以下函数“填零一个数字”:

/**
 * @param number The number
 * @param minLength Minimal length for your string with leading zeroes
 * @return Your formatted string
 */
function zerofill(nb, minLength) {
    // Convert your number to string.
    let nb2Str = nb.toString()

    // Guess the number of zeroes you will have to write.
    let nbZeroes = Math.max(0, minLength - nb2Str.length)

    // Compute your result.
    return `${ '0'.repeat(nbZeroes) }${ nb2Str }`
}

console.log(zerofill(5, 6))    // Displays "000005"

使用 ES2017+:

/**
 * @param number The number
 * @param minLength Minimal length for your string with leading zeroes
 * @return Your formatted string
 */
const zerofill = (nb, minLength) => nb.toString().padStart(minLength, '0')

console.log(zerofill(5, 6))    // Displays "000005"

为什么不使用递归?

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

...ETC。

干杯

一些猴子补丁也有效

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 zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}

只是为了好玩,这是我的 pad 函数版本:

function pad(num, len) {
  return Array(len + 1 - num.toString().length).join('0') + num;
}

它也不会截断长于填充长度的数字

如果性能真的很关键(循环数百万条记录),可以预先生成一个填充字符串数组,避免每次调用都这样做。

时间复杂度: O(1)
空间复杂度: O(1)

 const zeroPads = Array.from({ length: 10 }, (_, v) => '0'.repeat(v)) function zeroPad(num, len) { const numStr = String(num) return (zeroPads[len - numStr.length] + numStr) }

function zeroFill(number, width) {
    width -= (number.toString().length - /\./.test(number));
    if (width > 0) {
        return new Array(width + 1).join('0') + number;
    }
    return number + ""; // always return a string
}

对 Peter 的代码进行了细微的更改。 使用他的代码,如果输入是 (1.2, 3),则返回的值应该是 01.2,但它返回的是 1.2。 此处的更改应该可以纠正这一点。

function numberPadding(n, p) {
  n = n.toString();
  var len = p - n.length;
  if (len > 0) {
    for (var i=0; i < len; i++) {
      n = '0' + n;
    }
  }
  return n;
}

也许我太天真了,但我认为这可以在一个简单而有效的代码行中工作(对于正数):

padded = (value+Math.pow(10,total_length)+"").slice(1)

只要您根据您的一组值(如任何零填充)保持您的长度正常,这应该可以工作。

步骤是:

  1. 将 10 的幂与正确的 0 数相加 [69+1000 = 1069]
  2. 使用 +"" [1069 => "1069"] 转换为字符串
  3. 切片第一个 1,这是第一次乘法的结果 ["1069" => "069"]

对于自然列表(文件、目录...)非常有用。

这种方法不是更快,但它是相当原生的。

zeroPad = function (num, count) {
    return [Math.pow(10, count - num.toString().length), num].join('').substr(1);
};

一个简单的我的用例(填充毫秒永远不 > 999)您可以调整零的数量,或者如果需要使用更通用的方式。

/**
 * @val integer
 * @zeros padding
 */
function zeroFill(val, zeros)
{
    var str = val.toString();
    if (str.length >= zeros)
        return str;
    str = "000" + str;
    return str.substring(str.length - zeros);
}

我对这个主题的一点贡献( https://gist.github.com/lucasferreira/a881606894dde5568029 ):

/* Autor: Lucas Ferreira - http://blog.lucasferreira.com | Usage: fz(9) or fz(100, 7) */
function fz(o, s) {
    for(var s=Math.max((+s||2),(n=""+Math.abs(o)).length); n.length<s; (n="0"+n));
    return (+o < 0 ? "-" : "") + n;
};

用法:

fz(9) & fz(9, 2) == "09"
fz(-3, 2) == "-03"
fz(101, 7) == "0000101"

我知道,这是一个很脏的函数,但它速度很快,即使是负数也能工作;)

function zFill(n,l){
    return 
      (l > n.toString().length) ? 
        ( (Array(l).join('0') + n).slice(-l) ) : n;
}

只是想发表评论(但我没有足够的分数)最高投票的答案因负数和小数而失败

function padNumber(n,pad) {
    p = Math.pow(10,pad);
    a = Math.abs(n);
    g = (n<0);
    return (a < p) ?  ((g ? '-' : '') + (p+a).toString().substring(1)) : n;
}

padNumber( -31.235, 5);

"-00031.235"

sprintf.js是用于浏览器和 node.js 的完整开源 JavaScript sprintf 实现。

它的原型很简单:

 string sprintf(string format , [mixed arg1 [, mixed arg2 [ ,...]]])

我想在整个解决方案中推荐来自Alexandru Mărăşteanusprintf模块,看起来就像:

var sprintf = require('sprintf');
var zeroFilled = sprintf('%06d', 5);

console.log(zeroFilled); // 000005

注意:我在 6 年后回答这个问题,但考虑到它有大量的视图和答案,这个问题似乎变成了“ javascript 零领先”参考。

我正在使用这种简单的方法

var input = 1000; //input any number
var len = input.toString().length;
for (i = 1; i < input; i++) {
  console.log("MyNumber_" + ('000000000000000' + i).slice(-len));
}

好的,好的,我不敢相信我会费心为这个问题提交另一个答案,但我认为我的方法有点不同。 我需要填充数字的原因是将其显示在<pre>元素(屏幕日志的一部分)中,因此无论如何它最终都会是一个字符串。 我没有做任何数学运算,而是编写了一个简单的函数来将字符串值覆盖在掩码字符串上:

function overlayr(m, s) {
  return m.length > s.length ? m.substr(0, m.length - s.length) + s : s;
}

这样做的好处是我可以将它用于各种字符串对齐任务。 要调用它,只需将掩码和数字作为字符串传入:

> overlayr('00000', (5).toString())
< "00005"

作为额外的奖励,它可以正确处理溢出:

> overlayr('00000', (555555).toString())
< "555555"

当然,它不限于 0 填充:

> overlayr('*****', (55).toString())
< "***55"

我没有以这种形式看到任何答案,所以在这里我使用正则表达式和字符串操作进行拍摄

(也适用于负数十进制数)

代码:

function fillZeroes(n = 0, m = 1) {
  const p = Math.max(1, m);
  return String(n).replace(/\d+/, x => '0'.repeat(Math.max(p - x.length, 0)) + x);
}

一些输出:

console.log(fillZeroes(6, 2))          // >> '06'
console.log(fillZeroes(1.35, 2))       // >> '01.35'
console.log(fillZeroes(-16, 3))        // >> '-016'
console.log(fillZeroes(-1.456, 3))     // >> '-001.456'
console.log(fillZeroes(-456.53453, 6)) // >> '-000456.53453'
console.log(fillZeroes('Agent 7', 3))  // >> 'Agent 007'

一个愚蠢的递归方式是:

function paddingZeros(text, limit) {
  if (text.length < limit) {
    return paddingZeros("0" + text, limit);
  } else {
    return text;
  }
}

其中限制是您希望字符串的大小。

例如: appendZeros("7829", 20) // 00000000000000007829

另一个版本:

function zPad(s,n){
    return (new Array(n+1).join('0')+s).substr(-Math.max(n,s.toString().length));
}

甚至后来参加聚会。

function zfill(num, len) {
  return(0 > num ? "-" : "") + (Math.pow(10, len) <= Math.abs(num) ? "0" + Math.abs(num) : Math.pow(10, len) + Math.abs(num)).toString().substr(1)
}

这可以处理负数和数字长于字段宽度的情况。 和浮点数。

function numPadding (padding,i) {
    return padding.substr(0, padding.length - (Math.floor(i).toString().length)) + Math.floor(i );
}

numPadding("000000000",234); -> "000000234"

或者

function numPadding (number, paddingChar,i) {
    var padding = new Array(number + 1).join(paddingChar);
    return padding.substr(0, padding.length - (Math.floor(i).toString().length)) + Math.floor(i );
}

numPadding(8 ,"0", 234); -> "00000234";

可变长度填充函数

function addPaddingZeroes(value, nLength)
{
    var sValue = value + ''; //converts to string

    if(sValue.length>=nLength)
        return sValue;
    else
    {
        for(var nZero = 0; nZero < nLength; nZero++)
            sValue = "0" + sValue;
        return (sValue).substring(nLength - sValue.length, nLength);    
    }
}

一个简单的短递归函数来实现您的建议:

function padleft (YourNumber, OutputLength){
    if (YourNumber.length >= OutputLength) {
        return YourNumber;
    } else {
        return padleft("0" +YourNumber, OutputLength);
    }
}
  • YourNumber是输入的数字。
  • OutputLength是首选的输出数字长度(左边有 0 填充)。

如果您的输入数字长度短于所需的输出数字长度,此函数将在左侧添加 0。

function uint_zerofill(num, width) {
    var pad = ''; num += '';
    for (var i = num.length; i < width; i++)
        pad += '0';
    return pad + num;
}

一点数学可以给你一个单行函数:

function zeroFill( number, width ) {
  return Array(width - parseInt(Math.log(number)/Math.LN10) ).join('0') + number;
}

这是假设number是一个不比width的整数。 如果调用例程不能保证,该函数将需要进行一些检查:

function zeroFill( number, width ) {
    var n = width - parseInt(Math.log(number)/Math.LN10);
    return (n < 0) ? '' + number : Array(n).join('0') + number;
}

我的贡献:

我假设您希望总字符串长度包括“点”。 如果不是,如果数字是浮点数,重写添加一个额外的零仍然很简单。

padZeros = function (num, zeros) {
        return (((num < 0) ? "-" : "") + Array(++zeros - String(Math.abs(num)).length).join("0") + Math.abs(num));
    }

这是两行函数中的一个小数组解决方案。 它还检查前导零是否小于数字字符串的长度。

function pad(num, z) {
    if (z < (num = num + '').length) return num;
    return Array(++z - num.length).join('0') + num;
}

我只是偶然发现这篇文章正在寻找本机解决方案。 由于没有内置的解决方案,这是我的看法:

function zerofill(number, width) {
    var num = '';
    while (width-- > 0) {
        num += '0';
    }

    return num.slice(0, - (number + '').length) + number + '';
}

如果你使用 Lodash。

 var n = 1; alert( _.padLeft(n, 2, 0) ); // 01 n = 10; alert( _.padLeft(n, 2, 0) ); // 10
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.0/lodash.min.js"></script>

ES6 使这变得相当简单:

function pad (num, length, countSign = true) {
  num = num.toString()
  let negative = num.startsWith('-')
  let numLength = negative && !countSign ? num.length - 1 : num.length
  if (numLength >= length) {
    return num
  } else if (negative) {
    return '-' + '0'.repeat(length - numLength) + num.substr(1)
  } else {
    return '0'.repeat(length - numLength) + num
  }
}

pad(42, 4)          === '0042'
pad(12345, 4)       === '12345'
pad(-123, 4)        === '-100'
pad(-123, 4, false) === '-0100'

仅供参考,更清晰,更易读的语法恕我直言

"use strict";
String.prototype.pad = function( len, c, left ) {
    var s = '',
        c = ( c || ' ' ),
        len = Math.max( len, 0 ) - this.length,
        left = ( left || false );
    while( s.length < len ) { s += c };
    return ( left ? ( s + this ) : ( this + s ) );
}
Number.prototype.pad = function( len, c, left ) {
    return String( this ).pad( len, c, left );
}
Number.prototype.lZpad = function( len ) {
    return this.pad( len, '0', true );
}

这也导致结果的视觉和可读性故障比其他一些解决方案更少,后者将“0”强制为字符; 回答我的问题 如果我想填充其他字符,或者在另一个方向(右填充),我该怎么做,同时保持易于输入和清晰阅读。 很确定它也是 DRY'est 示例,实际前导零填充函数体的代码最少(因为其他依赖函数在很大程度上与问题无关)。

该代码可通过此 github 用户的 gist 进行评论(代码的原始来源) https://gist.github.com/Lewiscowles1986/86ed44f428a376eaa67f

关于控制台和脚本测试的说明,数字文字似乎需要括号或变量才能调用方法,因此 2.pad(...) 会导致错误,而 (2).pad(0,'#' ) 将不会。 这似乎对所有数字都是一样的

这是我编写的一个角度提供程序,它利用了@profitehlolz 的答案,但采用了记忆化,因此常用的填充长度-填充字符组合不会不必要地调用数组构建连接:

angular.module('stringUtilities', [])
    .service('stringFunctions', [function() {
        this.padMemo={ };
        this.padLeft=function(inputString,padSize,padCharacter) {

            var memoKey=padSize+""+padCharacter;

            if(!this.padMemo[memoKey]) {

                this.padMemo[memoKey]= new Array(1 + padSize).join(padCharacter);
            }

           var pad=this.padMemo[memoKey];
           return (pad + inputString).slice(-pad.length);
       };
}]);
exports.pad = (num, length) => "0".repeat(length - num.toString().length) + num;

如果npm在您的环境中可用,可以使用一些现成的包: www.npmjs.com/browse/keyword/zeropad

我喜欢零填充

安装

$ npm install zero-fill

用法

var zeroFill = require('zero-fill')

zeroFill(4, 1)      // '0001' 
zeroFill(4, 1, '#') // '###1' custom padding
zeroFill(4)(1)      // '0001' partials

一个简单的功能:

function padStr(number, numDigits){
  return 
    (number < 0 ? '-':'') 
    + ((new Array(numDigits + 1).join("0"))
    + Math.abs(number)).slice(-numDigits);
}

我在 ecmaScript6 (TypeScript) 中写了一些东西,也许有人可以使用它:

class Helper {
    /**
     * adds leading 0 and returns string if value is not minSize long, 
     * else returns value as string
     *
     * @param {string|number} value
     * @param {number} minSize
     * @returns {string}
     */
    public static leadingNullString(value: string|number, minSize: number): string {
        if (typeof value == "number") {
            value = "" + value;
        }
        let outString: string = '';
        let counter: number = minSize - value.length;
        if (counter > 0) {
            for (let i = 0; i < counter; i++) {
                outString += '0';
            }
        }
        return (outString + value);
    }
}

Helper.leadingNullString(123, 2); 返回“123”

Helper.leadingNullString(5, 2); 返回“05”

Helper.leadingNullString(40,2); 返回“40”

ecmaScript4 (JavaScript) 转换如下所示:

var Helper = (function () {
    function Helper() {
    }
    Helper.leadingNullString = function (value, minSize) {
        if (typeof value == "number") {
            value = "" + value;
        }
        var outString = '';
        var counter = minSize - value.length;
        if (counter > 0) {
            for (var i = 0; i < counter; i++) {
                outString += '0';
            }
        }
        return (outString + value);
    };
    return Helper;
}());

我有 2 个解决方案。 如果您知道这就是您想要快速完成的所有操作,那么第一个是真正的基本操作,即用零来坏一个数字。

第二个也将填充负数 - 与似乎具有最佳答案分数的“聪明”解决方案相同。

开始:

 // One liner simple mode! // (always ensure the number is 6 digits long knowing its never negative) var mynum = 12; var mynum2 = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum; alert("One liner to pad number to be 6 digits long = Was "+mynum+" Now "+mynum2); // As a function which will also pad negative numbers // Yes, i could do a check to only take "-" into account // if it was passed in as an integer and not a string but // for this, i haven't. // // @s The string or integer to pad // @l The minumum length of @s // @c The character to pad with // @return updated string function padme(s,l,c){ s = s.toString(); c = c.toString(); m = s.substr(0,1)=="-"; return (m?"-":"")+c.repeat((n=l-(s.length-(m?1:0)))>0?n:0)+s.substr((m?1:0)); } alert("pad -12 to ensure it is 8 digits long = "+padme(-12,8,0)); alert("pad 'hello' with 'x' to ensure it is 12 digits long = "+padme('hello',12,'x'));

一个简单优雅的解决方案,其中 n 是数字,l 是长度。

function nFill (n, l) {return (l>n.toString().length)?((Array(l).join('0')+n).slice(-l)):n;}

如果超出预期,这会保留长度,以免更改数字。

 n = 500; console.log(nFill(n, 5)); console.log(nFill(n, 2)); function nFill (n, l) {return (l>n.toString().length)?((Array(l).join('0')+n).slice(-l)):n;}

以下提供了一个快速快速的解决方案:

 function numberPadLeft(num , max, padder = "0"){ return "" == (num += "") ? "" : ( dif = max - num.length, dif > 0 ? padder.repeat(dif < 0 ? 0 : dif) + num : num ) }

在编写数字基转换器时,我想出了一个荒谬的单行代码。 在其他答案中没有看到任何类似的东西,所以这里是:

 // This is cursed function p(i,w,z){z=z||0;w=w||8;i+='';var o=i.length%w;return o?[...Array(wo).fill(z),...i].join(''):i;} console.log(p(8675309)); // Default: pad w/ 0 to 8 digits console.log(p(525600, 10)); // Pad to 10 digits console.log(p(69420, 10, 'X')); // Pad w/ X to 10 digits console.log(p(8675309, 4)); // Pad to next 4 digits console.log(p(12345678)); // Don't pad if you ain't gotta pad

或者,以一种不太容易背叛我已将我的灵魂卖给 Black Perl 的形式:

function pad(input, width, zero) {
    zero = zero || 0; width = width || 8;  // Defaults
    input += '';                           // Convert input to string first
    
    var overflow = input.length % width    // Do we overflow?
    if (overflow) {                        // Yep!  Let's pad it...
        var needed = width - overflow;     // ...to the next boundary...
        var zeroes = Array(needed);        // ...with an array...
        zeroes = zeroes.fill(zero);        // ...full of our zero character...
        var output = [...zeroes,...input]; // ...and concat those zeroes to input...
        output = output.join('');          // ...and finally stringify.
    } else {
        var output = input;                // We don't overflow; no action needed :)
    }
    
    return output;                         // Done!
}

将其与其他答案区分开来的一件事是,它将数字长度与目标宽度取,而不是简单的大于检查。 如果您想确保结果长度是目标宽度的某个倍数(例如,您需要输出长度为 5 或 10 个字符),这很方便。

不知道它的性能如何,但是嘿,至少它已经缩小了!

这是我认为很酷的一个小技巧:

(2/10000).toString().split(".")[1]
"0002"
(52/10000).toString().split(".")[1]
"0052"

发布以防这是您要查找的内容,将以毫秒为单位的剩余时间转换为字符串,例如 00:04:21

function showTimeRemaining(remain){
  minute = 60 * 1000;
  hour = 60 * minute;
  //
  hrs = Math.floor(remain / hour);
  remain -= hrs * hour;
  mins = Math.floor(remain / minute);
  remain -= mins * minute;
  secs = Math.floor(remain / 1000);
  timeRemaining = hrs.toString().padStart(2, '0') + ":" + mins.toString().padStart(2, '0') + ":" + secs.toString().padStart(2, '0');
  return timeRemaining;
}

我发现这个问题很有趣,我把我的小贡献

 function zeroLeftComplete(value, totalCharters = 3) { const valueString = value.toString() || '0' const zeroLength = valueString.length - totalCharters if (Math.sign(parseInt(zeroLength)) === -1) { const zeroMissing = Array.from({ length: Math.abs(zeroLength) }, () => '0').join('') return `${zeroMissing}${valueString}` } else return valueString }; console.log(zeroLeftComplete(0)); console.log(zeroLeftComplete(1)); console.log(zeroLeftComplete(50)); console.log(zeroLeftComplete(50561,3));

我们的测试是虚假的,因为我的测试有误。

zeroPad = function (num, count) {
    return ((num / Math.pow(10, count)) + '').substr(2);
};

Paul 是最快的,但我认为 .substr 比 .slice 快,即使它多一个字符;)

在这里寻找一个标准。 和保罗和乔纳森有同样的想法......他们的想法超级可爱,这是一个可怕的可爱版本:

function zeroPad(n,l,i){
    return (i=n/Math.pow(10,l))*i>1?''+n:i.toFixed(l).replace('0.','');
}

也有效(我们假设整数,是吗?)...

> zeroPad(Math.pow(2, 53), 20);
'00009007199254740992'
> zeroPad(-Math.pow(2, 53), 20);
'-00009007199254740992'
> zeroPad(Math.pow(2, 53), 10);
'9007199254740992'
> zeroPad(-Math.pow(2, 53), 10);
'-9007199254740992'

我用了

Utilities.formatString("%04d", iThe_TWO_to_FOUR_DIGIT) 

最多有 4 个前导 0

注意:这需要 Google 的应用程序脚本实用程序:

https://developers.google.com/apps-script/reference/utilities/utilities#formatstringtemplate-args

要在数字末尾填充,请使用 num.toFixed

例如:

  document.getElementById('el').value = amt.toFixed(2);

这是我找到的最简单的解决方案,并且有效。

嗯......我还没有看到这个问题的“终极”答案,如果你面临同样的挑战,我必须为你节省一些时间,遗憾的是 JavaScript 上没有内置函数; 但是 PHP 中有一个很棒的函数,它在填充字符串以及带有单个字符或任意字符串的数字方面做得很好,所以在我因在 JS 上没有正确的工具而苦恼了一段时间后[主要用于填零数字,通常用于修剪字符串以适应固定长度] 和过多的编码工作 我决定编写自己的函数,该函数与梦想中的 PHP 函数功能相同[“几乎相同”,请继续阅读],但使用舒适的客户端 JavaScript。

function str_pad(input,pad_length,pad_string,pad_type){
    var input=input.toString();
    var output="";
    if((input.length>pad_length)&&(pad_type=='STR_PAD_RIGHT')){var output=input.slice(0,pad_length);}
    else if((input.length>pad_length)&&(pad_type=='STR_PAD_LEFT')){var output=input.slice(input.length-pad_length,input.length);}
    else if((input.length<pad_length)&&(pad_type=='STR_PAD_RIGHT')){
        var caracteresNecesarios=pad_length-input.length;
        var rellenoEnteros=Math.floor(caracteresNecesarios/pad_string.length);
        var rellenoParte=caracteresNecesarios%pad_string.length;
        var output=input;
        for(var i=0;i<rellenoEnteros;i++){var output=output+pad_string;};
        var output=output+pad_string.slice(0,rellenoParte);
    }
    else if((input.length<pad_length)&&(pad_type=='STR_PAD_LEFT')){
        var caracteresNecesarios=pad_length-input.length;
        var rellenoEnteros=Math.floor(caracteresNecesarios/pad_string.length);
        var rellenoParte=caracteresNecesarios%pad_string.length;
        var output="";
        for(var i=0;i<rellenoEnteros;i++){var output=output+pad_string;};
        var output=output+pad_string.slice(0,rellenoParte);
        var output=output+input;
    }
    else if(input.length==pad_length){var output=input;};
    return output;
};

我的函数唯一没有做的是STR_PAD_BOTH行为,我可以用一些时间和更舒适的键盘添加它。 您可以调用该函数并对其进行测试; 如果您不介意内部代码在西班牙语中使用一两个词,那么您会喜欢它……我认为这没什么大不了的。 我没有为我的编码添加“水印”注释,因此您可以在工作中无缝使用它,我也没有压缩代码以增强可读性。 使用它并像这样测试它并传播代码

alert("str_pad('murcielago',20,'123','STR_PAD_RIGHT')="+str_pad('murcielago',20,'123','STR_PAD_RIGHT')+'.');
function zeroPad(num,digits){ return ((num/Math.pow(10,digits))+'').slice(2) } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM