在JavaScript中,我需要填充。
例如,如果我有数字9,它将是“0009”。如果我有多个说10,它将是“0010”。请注意它将始终包含四位数。
执行此操作的一种方法是减去数字减去4以获得我需要放置的0的数量。
这样做有一种更明智的方法吗?
答案 0 :(得分:558)
到目前为止,没有太多“光滑”的事情发生了:
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
答案 1 :(得分:226)
function padToFour(number) {
if (number<=9999) { number = ("000"+number).slice(-4); }
return number;
}
那样的东西?
Bonus难以理解但更加滑动的单行ES6版本:
let padToFour = number => number <= 9999 ? `000${number}`.slice(-4) : number;
ES6isms:
let
是一个块范围变量(与var
的功能范围相对)=>
是一个箭头函数,除了其他内容之外,还取代function
并以其参数为前缀number =>
)return
开头,则可以省略大括号和return
关键字,只需使用表达式答案 2 :(得分:127)
尝试:
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'
答案 3 :(得分:60)
好笑,我最近不得不这样做。
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"
不漂亮,但有效。
答案 4 :(得分: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);
}
答案 5 :(得分:12)
你可以这样做:
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 );
}
这有两件事:
Math.floor(num)
代替~~num
将支持更大的数字。答案 6 :(得分:3)
为了好玩,不要使用循环来创建额外的零:
function zeroPad(n,length){
var s=n+"",needed=length-s.length;
if (needed>0) s=(Math.pow(10,needed)+"").slice(1)+s;
return s;
}
答案 7 :(得分:2)
这实际上并不是很“光滑”,但执行整数运算比为每个填充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位数填充),因此它不是通用的。
答案 8 :(得分:2)
由于你提到它总是长度为4,所以我不会做任何错误检查来制作这个光滑的。 ;)
function pad(input) {
var BASE = "0000";
return input ? BASE.substr(0, 4 - Math.ceil(input / 10)) + input : BASE;
}
想法:只需将'0000'替换为提供的数字......问题是,如果input
为0,我需要对其进行硬编码以返回'0000'。 LOL。
这应该足够光滑。
JSFiddler:http://jsfiddle.net/Up5Cr/