JavaScript将数字格式化为始终具有3位数的日期

15

可能是重复问题:
如何使用JavaScript创建填充为零的值?

我需要输出一个始终具有3位数字的日期。它必须写成003而不是3,必须写成012而不是12。如果大于100,则无需进行格式化输出。 我想知道是否有正则表达式或一些快速的内联脚本可以使用,或者我必须创建一个函数来执行并返回结果。谢谢!


你可以在这里查看答案:https://dev59.com/YXRB5IYBdhLWcg3weXOX - Jonathan M
只有正确的答案是String(<yourNumber>)。padStart(3,0),但由于这个问题已经关闭,我实际上无法回答。 - undefined
6个回答

37

这样怎么样:

 zeroFilled = ('000' + x).substr(-3)

对于任意宽度:

 zeroFilled = (new Array(width).join('0') + x).substr(-width)

根据评论,这似乎更准确:

lpad = function(s, width, char) {
    return (s.length >= width) ? s : (new Array(width).join(char) + s).slice(-width);
}

@VisioN:标题上说“始终为3位数”。 - user1106925
1
尽管负索引在IE8及以下版本中会失败。 - user1106925
@amnotiam 对的,但还有另一种短语可以考虑不同的方式:如果大于100,则无需格式化输出。谁知道哪种方法是正确的,保险起见最好玩得安全些。 - VisioN
@VisioN:好的,帖子已更新。 - georg
@andreszs substring 不支持负索引(链接)。最好使用 slice() 代替。 - Will Blair
显示剩余2条评论

6

我在Samuel Mullen的博客上找到了一个优雅的解决方案。我只是优化了zeroes的创建。

function lpad(value, padding) {
    var zeroes = new Array(padding+1).join("0");
    return (zeroes + value).slice(-padding);
}

用法:lpad(12, 3) 的结果是 "012"


5

您可以这样做...

("00" + day).slice(-3)

它会在前面添加零,然后 .slice() 总是给你字符串的最后3个值。

1
这是一个简单的函数,可以将数字填充到特定宽度并用零补齐:
function zeroFill(number, width) {
    width -= number.toString().length;
    if(width > 0) {
        return new Array(width + (/\./.test(number) ? 2 : 1)).join('0') + number;
    }
    return number + ""; // always return a string
}

(来自如何在数字前面填充零?)

由于原始答案没有解释函数的工作原理,我在这里进行解释。

width 最初包含您想要的总长度,因此 width - number_of_digits 是所需填充字符的数量。
new Array(len + 1).join(str) 重复 str len 次。
正则表达式用于在数字包含小数点的情况下添加一个额外的填充零,因为小数点也包含在使用 number.toString().length 确定的 number_of_digits 中。


1

1
我会编写以下函数:
var pad = function(n, length) {
    var str = "" + n;
    if(str.length < length) str = new Array(length - str.length).join("0") + str;
    return str;
};

我认为你的意思是 .join("0"),而且我认为你应该把它放在 str 之前。 - Phrogz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接