Depois de muito, muito tempo testando 15 funções / métodos diferentes encontrados nas perguntas, agora sei qual é o melhor (o mais versátil e o mais rápido).
Tirei 15 funções / métodos das respostas a esta pergunta e fiz um script para medir o tempo necessário para executar 100 blocos. Cada bloco preencheria o número 9
com 2000
zeros. Isso pode parecer excessivo e é, mas fornece uma boa idéia sobre o dimensionamento das funções.
O código que usei pode ser encontrado aqui:
https://gist.github.com/NextToNothing/6325915
Sinta-se livre para modificar e testar o código você mesmo.
Para obter o método mais versátil, você precisa usar um loop. Isso ocorre porque, com números muito grandes, é provável que outros falhem, enquanto isso será bem-sucedido.
Então, qual loop usar? Bem, isso seria um while
loop. Um for
loop ainda é rápido, mas while
é apenas um pouco mais rápido (alguns ms) - e mais limpo.
Respostas como essas de Wilco
, Aleksandar Toplek
ou Vitim.us
farão o trabalho perfeitamente.
Pessoalmente, tentei uma abordagem diferente. Tentei usar uma função recursiva para preencher a string / número. Funcionou melhor do que métodos para ingressar em uma matriz, mas, ainda assim, não funcionou tão rápido quanto um loop for.
Minha função é:
function pad(str, max, padder) {
padder = typeof padder === "undefined" ? "0" : padder;
return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}
Você pode usar minha função com ou sem definir a variável padding. Então assim:
pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'
Pessoalmente, após meus testes, eu usaria um método com um loop while, como Aleksandar Toplek
ou Vitim.us
. No entanto, eu o modificaria um pouco para que você possa definir a string de preenchimento.
Então, eu usaria este código:
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'
Você também pode usá-lo como uma função de protótipo, usando este código:
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'