在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?
注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。
在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?
注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。
当前回答
function zeroPad(num,digits){ return ((num/Math.pow(10,digits))+'').slice(2) }
其他回答
我没有看到任何人指出,当你使用String.prototype.substr()与负数时,它从右边计数。
OP问题的一个线性解决方案,即数字5的6位零表示,是:
console.log((“00000000” + 5).substr(-6));
概括起来,我们会得到:
函数pad(num, len) {return ("00000000" + num).substr(-len)}; console.log(垫(5、6)); console.log(垫(45岁,6)); console.log (pad (345 6)); console.log (pad (2345 6)); console.log (pad (12345 6));
事实上,我最近不得不想出一些类似的东西。 我想肯定有一种不用循环的方法。
这是我想到的。
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;
}
然后使用它提供一个数字到零pad:
> 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与对数变化)。猜猜哪一个的表现比另外两个好?:)
function zeroPad(num,digits){ return ((num/Math.pow(10,digits))+'').slice(2) }
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 //如果没有必要,不要填充
pad('S', 'O', 2) = SO
…等。
干杯
Mnah……我还没有看到这个问题的“终极”答案,如果你面临同样的挑战,我必须节省你一些时间,遗憾的是JavaScript中没有内置的函数。
但是PHP中有一个很棒的函数,它在填充字符串以及单个字符或任意字符串的数字方面做得很好。经过一段时间的思考,我没有合适的JavaScript工具(主要用于零数字,通常用于调整字符串以适应固定长度)和过多的编码工作,我决定编写自己的函数。
它做了同样的事情(“几乎一样”;详细信息请继续阅读),梦想的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') + '.');