Dopo un lungo, lungo periodo di test di 15 diverse funzioni / metodi trovati nelle risposte a queste domande, ora so qual è il migliore (il più versatile e il più veloce).
Ho preso 15 funzioni / metodi dalle risposte a questa domanda e ho creato uno script per misurare il tempo impiegato per eseguire 100 pad. Ogni pad riempirebbe il numero 9
di 2000
zeri. Questo può sembrare eccessivo, e lo è, ma ti dà una buona idea sul ridimensionamento delle funzioni.
Il codice che ho usato può essere trovato qui:
https://gist.github.com/NextToNothing/6325915
Sentiti libero di modificare e testare il codice tu stesso.
Per ottenere il metodo più versatile, devi utilizzare un ciclo. Questo perché con numeri molto grandi è probabile che altri falliscano, mentre ciò avrà successo.
Quindi, quale loop usare? Bene, sarebbe un while
ciclo. Un for
loop è ancora veloce, ma un while
loop è solo leggermente più veloce (un paio di ms) - e più pulito.
Risposte come quelle di Wilco
, Aleksandar Toplek
o Vitim.us
faranno perfettamente il lavoro.
Personalmente, ho provato un approccio diverso. Ho provato a usare una funzione ricorsiva per riempire la stringa / numero. Ha funzionato meglio dei metodi che si uniscono ad un array ma, comunque, non ha funzionato velocemente come un ciclo for.
La mia funzione è:
function pad(str, max, padder) {
padder = typeof padder === "undefined" ? "0" : padder;
return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}
Puoi usare la mia funzione con o senza l'impostazione della variabile padding. Quindi in questo modo:
pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'
Personalmente, dopo i miei test, userei un metodo con un ciclo while, come Aleksandar Toplek
o Vitim.us
. Tuttavia, lo modificherei leggermente in modo da poter impostare la stringa di riempimento.
Quindi, vorrei usare questo codice:
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'
Puoi anche usarlo come funzione prototipo, usando questo codice:
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'