在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?
注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。
在JavaScript中推荐的零填充方法是什么?我想我可以构建一个自定义函数来填充零到类型转换的值,但我想知道是否有更直接的方法来做到这一点?
注意:这里的“zeroffilled”指的是数据库意义上的单词(其中数字5的6位零填充表示形式将是“000005”)。
当前回答
不要白费力气;使用下划线字符串:
js小提琴
var numToPad = '5';
alert(_.str.pad(numToPad, 6, '0')); // Yields: '000005'
其他回答
只是另一种解决方案,但我觉得更容易辨认。
函数zeroFill(text, size) { 而(文本。长度< size){ Text = "0" + Text; } 返回文本; }
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') + '.');
在测试了这个问题答案中15个不同的函数/方法之后,我现在知道哪个是最好的(最通用和最快的)。
我从这个问题的答案中选取了15个函数/方法,并制作了一个脚本来测量执行100个pad所花费的时间。每个数字垫上2000个零。这看起来有点过分,确实如此,但它让你对函数的缩放有了一个很好的了解。
我使用的代码可以在这里找到: https://gist.github.com/NextToNothing/6325915
您可以自行修改和测试代码。
为了得到最通用的方法,你必须使用循环。这是因为在数量非常大的情况下,其他人可能会失败,而这将会成功。
那么,使用哪个循环呢?这是一个while循环。for循环仍然很快,但while循环只是稍微快一点(几毫秒)——而且更干净。
Wilco, Aleksandar Toplek或Vitim的回答。我们会完美地完成这项工作。
就我个人而言,我尝试了不同的方法。我尝试使用递归函数填充字符串/数字。它比连接数组的方法更好,但仍然没有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 Toplek或vic .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'
我不敢相信这里有这么多复杂的答案……就用这个吧:
var zerofilled = ('0000'+n).slice(-4);
让n = 1 var zerofilled = ('0000' n).切片(4); 控制台日志(zerofilled)。
我们的测试是假的,因为我的有个错别字。
zeroPad = function (num, count) {
return ((num / Math.pow(10, count)) + '').substr(2);
};
Paul的是最快的,但我认为.substr比.slice快,即使它多了一个字符;)