在JavaScript中使用前导零填充数字

Nat*_*Pet 420 javascript formatting

可能重复:
如何使用JavaScript创建Zerofilled值?

在JavaScript中,我需要填充.

例如,如果我有数字9,它将是"0009".如果我有多个说10,它将是"0010".请注意它将如何始终包含四位数.

一种方法是减去数字减去4得到我需要放置的0的数量.

有没有更明智的方式这样做?

Poi*_*nty 579

到目前为止,并没有太多的"浮油":

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

使用数字初始化数组时,它会创建一个length设置为该值的数组,以便该数组显示包含许多undefined元素.虽然一些Array实例方法跳过没有值的数组元素,但是.join()没有,或者至少不完全; 它将它们视为它们的值是空字符串.因此,您可以获得每个数组元素之间的零字符(或任何"z")的副本; 这就是为什么那里有一个+ 1.

用法示例:

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

pad(10, 4, '-'); // --10
Run Code Online (Sandbox Code Playgroud)

  • "光滑",紧凑,可扩展.`function pad(n,width = 3,z = 0){return(String(z).repeat(width)+ String(n)).slice(String(n).length)}` (14认同)
  • 你真的需要一个阵列吗?`function pad(n,width,z){while(n.length <width)n =''+ z + n; return n;}` (10认同)
  • 谢谢你的回答,但是像"n"和"z"这样的变量对于他们正在做的事情并不直观. (8认同)
  • @Pointy分配空间是程序员看不到的实现细节(没有打开的实现,我知道这样做(Rhino,V8,SM,JSC)任何分配内存的实现_and_暴露属性都违反了EcmaScript规范非常明确(在"数组构造函数15.4.2.2"下).这不是什么大问题,答案不是很好,如果修复这个细节会很好. (4认同)
  • "当用数字初始化数组时,它会创建一个包含许多未定义元素的数组." - 我认为这不正确.它只设置`length`属性并连接迭代`length`次.访问未定义的属性总是返回`undefined`.参见[1]中数组(5)`vs`"0"中的"5" (2认同)
  • @DLeh"n"是要填充的**n umber,"z"是(默认情况下)**z**ero或其他一些用于填充的字符. (2认同)
  • 聪明是好的,但不能以牺牲可读性为代价 (2认同)
  • @HaiPhan我会对一个不懂`.join()`的JavaScript程序员感到紧张. (2认同)

Rob*_*ton 236

function padToFour(number) {
  if (number<=9999) { number = ("000"+number).slice(-4); }
  return number;
}
Run Code Online (Sandbox Code Playgroud)

那样的东西?

Bonus难以理解但更光滑的单线ES6版本:

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

ES6isms:

  • let是一个块范围变量(与var功能范围相对)
  • =>是一个箭头函数,除了其他东西之外,还取代function了它的参数
  • 如果箭头函数采用单个参数,则可以省略括号(因此number =>)
  • 如果箭头函数体具有以return您开头的单行,则可以省略大括号和return关键字,只需使用表达式即可
  • 为了将函数体降低到单行,我作弊并使用了三元表达式

  • 实际上@JorgeOrpinel它不会截断.if语句使切片操作仅对具有四位或更少位数的数字进行操作.五位数的值至少为10000,不是<= 9999. (9认同)
  • 只是投了票,因为这不是模块化方法(仅适用于4位数).当然,它是特定问题的具体答案,但包括长度选项会更好(就像其他答案一样). (5认同)
  • 我认为自从`sprintf (padToFour, "%04d", number);`时代以来我们已经取得了倒退的进步。 (4认同)

diE*_*cho 148

尝试:

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

现在测试:

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"
Run Code Online (Sandbox Code Playgroud)

DEMO


ECMAScript 8中,我们有新方法padStart, padEnd 其语法如下.

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

所以现在我们可以使用了

const str = "5";
str.padStart(4, '0'); // '0005'
Run Code Online (Sandbox Code Playgroud)

  • 不建议像任何其他内置扩展String原型. (6认同)
  • 你这样做的方式,`"5".lpad(" - ",4)`会产生"`---- 5`"而不是"`--- 5`". (5认同)
  • ES8 解决方案应该是当今这个问题的答案。您应该将其放在答案的顶部。 (5认同)
  • +1用于指出ES8解决方案.这里有一个简单的polyfill:http://2ality.com/2015/11/string-padding.html (4认同)
  • 为了完整起见,您应该从最终字符串中取出最后一个 `length` 字符,以处理 `padString` 超过一个符号的情况。 (2认同)

Pet*_*r C 61

有趣,我最近不得不这样做.

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

使用如下:

padDigits(9, 4);  // "0009"
padDigits(10, 4); // "0010"
padDigits(15000, 4); // "15000"
Run Code Online (Sandbox Code Playgroud)

不漂亮,但有效.

  • 要处理负数,请使用该数的绝对值,然后在最终结果上加上一个负号 ('-')。`(number &lt; 0 ? '-' : '') + Array(Math.max(digits - String(value).length + 1, 0)).join(0) + value` 其中 'value' 是 `Math.绝对(数字)`。 (2认同)

ken*_*bec 23

你确实说过你有一个号码 -

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 很想知道为什么这不是起来投票.似乎是最合理和最完整的解决方案.示例用法var v = 2; v.padZero(4); v.padZero(4, '+'); 产生'0002''+++ 2' (2认同)
  • 因为这太具体了,所以解决方案...```String.prototype.lpad = function(len,c){var s ='',c = c || '',len =(len || 2)-this.length; while(s.length &lt;len)s + = c; 返回s + this; } Number.prototype.lpad = function(len,c){return String(this).lpad(len,c); } Number.prototype.lpadZero = function(len){返回this.lpad(len,'0'); }`是可以预见的解决方案;如果错误使用pad会产生较少的效果驱动结果,它只会添加不影响可读性或可访问性的空格 (2认同)

Rob*_*rle 13

你可以这样做:

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

编辑:这只是一个函数的基本概念,但是为了增加对更大数字(以及无效输入)的支持,这可能会更好:

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

这有两件事:

  1. 如果数字大于指定的大小,它将只返回数字.
  2. 使用Math.floor(num)代替~~num将支持更大的数字.

  • `pad(1111111111111,10)`返回`714581447` (2认同)
  • 这是因为该数字对于我原始解决方案中使用的方法而言太大(~~ num)。为了支持更大的数字,我添加了使用Math.floor()的此函数的新版本。除此之外,您提供的数字大于您指定的大小,因此我为此情况添加了检查。 (2认同)