Come posso riempire un valore con zeri iniziali?


395

Qual è il modo consigliato per zerofillare un valore in JavaScript? Immagino di poter costruire una funzione personalizzata per il pad zeri su un valore tipizzato, ma mi chiedo se esiste un modo più diretto per farlo?

Nota: Per "zerofilled" intendo nel senso del database la parola (dove una rappresentazione zerofilled a 6 cifre del numero 5 sarebbe "000005").


Questa non è davvero abbastanza informazione per rispondere. L'istanza più comune di "zero padding" probabilmente sta anteponendo gli zeri alle date: 5/1/2008> 05/01/2008. È questo che vuoi dire?
Trittico,

6
Per le app dei nodi, utilizzare npm install sprintf-jse richiederlo nel file necessario:sprintf('%0d6', 5);
Droogans

function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;} ... supponendo nnon negativo
Paolo

@Paolo quella funzione non funziona se n è numerico. whilePer poter accedere, devi convertire n in una stringa prima din.length
Nick F

1
Un liner senza matematica o loop o librerie While? mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Adam Whateverson,

Risposte:


226

Nota per i lettori!

Come hanno sottolineato i commentatori, questa soluzione è "intelligente", e come spesso lo sono soluzioni intelligenti, è ad alta intensità di memoria e relativamente lenta. Se le prestazioni sono un problema per te, non usare questa soluzione!

Potenzialmente obsoleto : ECMAScript 2017 include String.prototype.padStart e Number.prototype.toLocaleString è presente da ECMAScript 3.1. Esempio:

var n=-0.1;
n.toLocaleString('en', {minimumIntegerDigits:4,minimumFractionDigits:2,useGrouping:false})

... genererà "-0000.10".

// or 
const padded = (.1+"").padStart(6,"0");
`-${padded}`

... genererà "-0000.1".

Una semplice funzione è tutto ciò che serve

function zeroFill( number, width )
{
  width -= number.toString().length;
  if ( width > 0 )
  {
    return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number;
  }
  return number + ""; // always return a string
}

potresti farlo in una libreria se vuoi conservare lo spazio dei nomi o altro. Come con l'estensione di jQuery .


1
Ora devi solo prenderti cura di numeri come 50.1234 e hai una versione leggibile della mia soluzione qui sotto! Tuttavia, supponevo che fossimo rimasti solo imbottitura, non imbottitura generale.
coderjoe,

7
Non sei un fan della creazione di un nuovo array ogni volta che vuoi sommare un valore. I lettori dovrebbero essere consapevoli del potenziale impatto sulla memoria e sul GC se stanno facendo un gran numero di questi (ad esempio su un server node.js che sta eseguendo migliaia di queste operazioni al secondo. La risposta di @ profitehlolz sembrerebbe essere la soluzione migliore .)
broofa,

6
Questo non funziona con valori negativi: zeroFill (-10, 7) -> "funzionare10"
digitalbath

2
Misura delle prestazioni tra le tre risposte principali qui: jsperf.com/left-zero-pad
tomsmeding,

12
A partire da ECMAScript 2017, c'è un padStart con funzione integrata .
Tomas Nikodym,

321

Modo semplice. È possibile aggiungere una moltiplicazione di stringhe per il pad e trasformarla in una funzione.

var pad = "000000";
var n = '5';
var result = (pad+n).slice(-pad.length);

Come una funzione,

function paddy(num, padlen, padchar) {
    var pad_char = typeof padchar !== 'undefined' ? padchar : '0';
    var pad = new Array(1 + padlen).join(pad_char);
    return (pad + num).slice(-pad.length);
}
var fu = paddy(14, 5); // 00014
var bar = paddy(2, 4, '#'); // ###2

95
Questa è una soluzione molto bella, la migliore che abbia mai visto. Per chiarezza, ecco una versione più semplice che sto usando per riempire i minuti nella formattazione temporale: ('0' + minuti) .slice (-2)
Luke Ehresman

17
Questo è 5 volte più lento dell'implementazione con un ciclo while: gist.github.com/4382935
andrewrk il

42
Questo ha un FLAW FATALE con numeri più grandi del previsto, il che è un evento estremamente comune. Ad esempio, paddy (888, 2)rendimenti 88e non 888come richiesto. Anche questa risposta non gestisce i numeri negativi.
Brock Adams,

8
@BrockAdams, zerofill viene in genere utilizzato per i numeri a larghezza fissa / i casi di formattazione - quindi penso che in realtà sarebbe meno probabile (o anche un non-problema) se viene assegnato un numero a 3 cifre quando si tenta di eseguire zerofill a 2 cifre.
Seaux

1
("000000" + somenum) .substr (-6,6) dove il numero di zeri e -6,6 corrispondono alla larghezza del pad. Stessa idea ma slice accetta un parametro in meno; non sono sicuro che la sezione sia più veloce o più lenta della sottrazione. Ovviamente la mia soluzione non necessita di assegnazioni variabili.
slartibartfast

315

Non posso credere a tutte le risposte complesse qui ... Usa questo:

var zerofilled = ('0000'+n).slice(-4);

27
Buono tranne numeri negativi e numeri più lunghi di 4 cifre.
wberry,

12
@wberry questo non doveva essere un codice pronto per la produzione, ma più una semplice spiegazione delle basi per risolvere la domanda attuale. Inoltre è molto facile determinare se un numero è positivo o negativo e aggiungere il segno appropriato se necessario, quindi non volevo raggruppare il mio esempio semplice con quello. Inoltre, è altrettanto facile fare una funzione prendendo una lunghezza di cifra come un arg e usandola al posto dei miei valori hardcoded.
Seaux,

5
@Seaux, hai detto: "non posso credere a tutte le risposte complesse" , e poi hai iniziato a spiegarti la complessità quando commentato. Questo significa che capisci che ci sono prospettive da cui la tua risposta non è perfetta. Da qui la complessità.
Om Shankar,

2
@OmShankar con "risposte complesse", non mi riferivo a risposte spiegate o dettagliate (che sono ovviamente incoraggiate su questo sito anche se la mia risposta non lo è), ma piuttosto risposte che contenevano una complessità del codice non necessaria.
Seaux

7
Mi piace questa risposta. Nel mio caso specifico, so che i numeri sono sempre positivi e mai più di 3 cifre, e questo è spesso il caso quando si riempie con 0 iniziali e il proprio input è ben noto. Bello!
Patrick Chu,

110

In realtà ho dovuto inventarmi qualcosa del genere di recente. Ho pensato che ci doveva essere un modo per farlo senza usare i loop.

Questo è quello che mi è venuto in mente.

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;
}

Quindi basta usarlo fornendo un numero a zero pad:

> zeroPad(50,4);
"0050"

Se il numero è maggiore dell'imbottitura, il numero si espanderà oltre l'imbottitura:

> zeroPad(51234, 3);
"51234"

Anche i decimali vanno bene!

> zeroPad(51.1234, 4);
"0051.1234"

Se non ti dispiace inquinare lo spazio dei nomi globale, puoi aggiungerlo direttamente a 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;
}

E se preferisci che i decimali occupino spazio nell'imbottitura:

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;
}

Saluti!



XDR si avvicinò con una variazione logaritmica che sembra funzionare meglio.

ATTENZIONE : questa funzione fallisce se num è uguale a zero (es. 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;
}

A proposito di prestazioni, tomsmeding ha confrontato le prime 3 risposte ( 4 con la variazione del registro ). Indovina quale ha sovraperformato notevolmente gli altri due? :)


9
Questo è buono, mi piace come sia leggibile e robusto. L'unica cosa che vorrei cambiare è il nome del numZerosparametro, poiché è fuorviante. Non è il numero di zeri che si desidera aggiungere, è la lunghezza minima che deve essere il numero. Un nome migliore sarebbe numLengtho addirittura length.
Senso

13
+1. A differenza delle risposte più votate, questa gestisce numeri negativi e non restituisce errori grossolani in caso di overflow !!?!
Brock Adams,

10
Misura delle prestazioni tra le tre risposte principali qui: jsperf.com/left-zero-pad
tomsmeding

4
Ho migliorato le prestazioni di questa risposta di oltre il 100% utilizzando i logaritmi. Si prega di consultare il test logaritmico su http://jsperf.com/left-zero-pad/10
XDR

2
La soluzione originale è migliore, la variazione logaritmica non funziona se numpuò essere zero ...
Ondra C.

69

Ecco cosa ho usato per riempire un numero fino a 7 caratteri.

("0000000" + number).slice(-7)

Questo approccio sarà probabilmente sufficiente per la maggior parte delle persone.

Modifica: se vuoi renderlo più generico puoi farlo:

("0".repeat(padding) + number).slice(-padding)

Modifica 2: Nota che da ES2017 puoi usare String.prototype.padStart:

number.toString().padStart(padding, "0")

Questo fallisce, gravemente, su grandi numeri e numeri negativi. number = 123456789, con il codice sopra riportato, ad esempio.
Brock Adams,

Questa soluzione è la migliore possibile in assoluto per determinati scenari! Non ho idea del perché non ci siamo inventati prima. Lo scenario è: hai un numero che è sempre positivo [come menzionato da Brock] e sai che non ci vorranno più caratteri del tuo limite. Nel nostro caso abbiamo un punteggio che memorizziamo in Amazon SDB. Come sai SDB non può confrontare i numeri, quindi tutti i punteggi devono essere a zero. Questo è estremamente facile ed efficace!
Krystian,

4
Mi scuso, avrei dovuto menzionare che questo non funzionerà con numeri negativi. Penso che questo si occupi del caso positivo più comune, tuttavia. Fa quello che mi serve, almeno!
chetbox,

Ne avevo bisogno di nuovo e ho capito che non ne hai bisogno new String. Puoi semplicemente usare i letterali stringa.
Chetbox

3
(new Array(padding + 1).join("0")può essere sostituito con"0".repeat(padding)
Pavel il

34

I browser moderni ora supportano padStart, ora puoi semplicemente fare:

string.padStart(maxLength, "0");

Esempio:

string = "14";
maxLength = 5; // maxLength is the max string length, not max # of fills
res = string.padStart(maxLength, "0");
console.log(res); // prints "00014"


@Flimm sentiti libero di modificarlo nella risposta :) È stato scritto 4 anni fa, quindi sono sicuro che le cose sono cambiate ora
Sterling Archer,

27

Sfortunatamente, ci sono molti suggerimenti inutili e complicati per questo problema, che in genere comportano la scrittura della propria funzione per eseguire operazioni matematiche o di stringa o chiamare un'utilità di terze parti. Tuttavia, esiste un modo standard per farlo nella libreria JavaScript di base con una sola riga di codice. Potrebbe valere la pena racchiudere questa riga di codice in una funzione per evitare di dover specificare parametri che non si desidera modificare come il nome o lo stile locale.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumIntegerDigits: 3,
    useGrouping: false
});

Questo produrrà il valore di "005" per il testo. È inoltre possibile utilizzare la funzione toLocaleString di Number per spostare gli zeri sul lato destro del punto decimale.

var amount = 5;

var text = amount.toLocaleString('en-US',
{
    style: 'decimal',
    minimumFractionDigits: 2,
    useGrouping: false
});

Questo produrrà il valore di "5.00" per il testo. Cambia useGrouping su true per usare i separatori di virgola per migliaia.

Si noti che l'utilizzo toLocaleString()con localese optionsargomenti è standardizzato separatamente in ECMA-402 , non in ECMAScript. Ad oggi, alcuni browser implementano solo il supporto di base , ovvero toLocaleString()possono ignorare qualsiasi argomento.

Esempio completo


Wow, questa è una soluzione super pulita e funziona in node.js.
jishi,

Ridacchiai quando lessi l'introduzione: "inutili suggerimenti complicati". Lo sviluppo del software, come in tutte le discipline ingegneristiche, comporta la ponderazione di compromessi. Ho provato questo "modo standard" da solo - e l'ho cronometrato. Funziona sicuramente, ma non sceglierei mai di usarlo per qualsiasi tipo di applicazione ripetitiva a causa di quanto è lento rispetto a molte altre soluzioni "home rolled".
Bearvarine,

1
È vero, molte funzioni JavaScript integrate funzionano male quando si esegue il loop su molti dati, ma direi che non dovresti usare JavaScript per quello, anche sul lato server come Node.js. Se hai molti dati da elaborare sul lato server, dovresti usare una piattaforma migliore come .NET o Java. Se si elaborano i dati sul lato client per la visualizzazione all'utente finale, è necessario elaborare i dati solo per ciò che si sta eseguendo il rendering nella schermata dell'utente finale. Ad esempio, esegue il rendering solo delle righe visibili di una tabella e non elabora i dati per altre strade.
Daniel Barbalace,

21

Se il numero di riempimento è noto in anticipo per non superare un determinato valore, esiste un altro modo per farlo senza loop:

var fillZeroes = "00000000000000000000";  // max number of zero fill ever asked for in global

function zeroFill(number, width) {
    // make sure it's a string
    var input = number + "";  
    var prefix = "";
    if (input.charAt(0) === '-') {
        prefix = "-";
        input = input.slice(1);
        --width;
    }
    var fillAmt = Math.max(width - input.length, 0);
    return prefix + fillZeroes.slice(0, fillAmt) + input;
}

Casi di prova qui: http://jsfiddle.net/jfriend00/N87mZ/


@BrockAdams: risolto per entrambi i casi menzionati. Se il numero è già largo quanto la larghezza del riempimento, non viene aggiunto alcun riempimento.
jfriend00

Grazie; +1. Tuttavia, i numeri negativi sono leggermente diversi dalla solita convenzione. Nel tuo caso di test, -88dovrebbe cedere "-00088", per esempio.
Brock Adams,

1
@BrockAdams - Non ero sicuro se la chiamata zeroFill(-88, 5)dovesse produrre -00088o -0088? Immagino che dipenda dal fatto che si desideri che l' widthargomento sia l'intera larghezza del numero o solo il numero di cifre (escluso il segno negativo). Un implementatore può facilmente cambiare il comportamento per non includere il segno negativo semplicemente rimuovendo la --widthriga di codice.
jfriend00

19

Il modo rapido e sporco:

y = (new Array(count + 1 - x.toString().length)).join('0') + x;

Per x = 5 e count = 6 avrai y = "000005"


1
Ho ottenuto y="0005"quanto sopra, y = (new Array(count + 1 - x.toString().length)).join('0') + x;è quello che mi ha datoy="000005"
forforf

3
@OrrSiloni: la soluzione di codice più breve è in realtà('0000'+n).slice(-4)
Seaux

14

Ecco una funzione rapida che mi è venuta in mente per fare il lavoro. Se qualcuno ha un approccio più semplice, sentiti libero di condividere!

function zerofill(number, length) {
    // Setup
    var result = number.toString();
    var pad = length - result.length;

    while(pad > 0) {
        result = '0' + result;
        pad--;
    }

    return result;
}

Non penso che ci sarà una soluzione "più semplice": sarà sempre una funzione di qualche tipo. Potremmo avere una discussione sull'algoritmo, ma alla fine della giornata, ti ritroverai comunque con una funzione che zerofills un numero.
Peter Bailey,

Il mio consiglio generale è di usare i cicli "for" poiché sono generalmente più stabili e più veloci nei linguaggi ECMAScript (ActionScript 1-3 e JavaScript)
cwallenpoole,

Oppure, salta del tutto l'iterazione;)
Peter Bailey,

Funzione più semplice? Probabilmente no. Uno che non va in loop? Questo è possibile ... sebbene l'algoritmo non sia del tutto banale.
coderjoe,

1
Wow, praticamente tutti i commenti sopra sono errati. La soluzione di @ profitehlolz è più semplice e adatta all'allineamento (non deve essere una funzione). Nel frattempo, for.vs. whilele prestazioni non sono abbastanza diverse per essere interessanti: jsperf.com/fors-vs-while/34
broofa

12

In ritardo alla festa qui, ma uso spesso questo costrutto per eseguire il riempimento ad hoc di un certo valore n, noto per essere un decimale positivo:

(offset + n + '').substr(1);

Dove offsetsono 10 ^^ cifre.

Ad esempio, riempimento a 5 cifre, dove n = 123:

(1e5 + 123 + '').substr(1); // => 00123

La versione esadecimale di questo è leggermente più dettagliata:

(0x100000 + 0x123).toString(16).substr(1); // => 00123

Nota 1: Mi piace anche la soluzione di @ profitehlolz, che è la versione stringa di questo, usando la caratteristica nifty di indice negativo di slice ().


12

Non so davvero perché, ma nessuno lo ha fatto nel modo più ovvio. Ecco la mia implementazione.

Funzione:

/** Pad a number with 0 on the left */
function zeroPad(number, digits) {
    var num = number+"";
    while(num.length < digits){
        num='0'+num;
    }
    return num;
}

Prototipo:

Number.prototype.zeroPad=function(digits){
    var num=this+"";
    while(num.length < digits){
        num='0'+num;
    }
    return(num);
};

Molto semplice, non vedo in alcun modo come questo possa essere più semplice. Per qualche motivo, qui su SO mi sono sembrato molte volte, le persone cercano solo di evitare i cicli "for" e "while" a tutti i costi. L'uso di regex probabilmente costerà molti più cicli per una così banale imbottitura a 8 cifre.


11

Uso questo snipet per ottenere una rappresentazione a 5 cifre

(value+100000).toString().slice(-5) // "00123" with value=123


9

Il potere della matematica!

x = numero intero da pad
y = numero di zero da pad

function zeroPad(x, y)
{
   y = Math.max(y-1,0);
   var n = (x / Math.pow(10,y)).toFixed(y);
   return n.replace('.','');  
}

9

Non ho visto nessuno sottolineare il fatto che quando usi String.prototype.substr () con un numero negativo conta da destra.

Una soluzione di una riga alla domanda del PO, una rappresentazione zerofilled a 6 cifre del numero 5, è:

console.log(("00000000" + 5).substr(-6));

Generalizzando otterremo:

function pad(num, len) { return ("00000000" + num).substr(-len) };

console.log(pad(5, 6));
console.log(pad(45, 6));
console.log(pad(345, 6));
console.log(pad(2345, 6));
console.log(pad(12345, 6));


8

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 9di 2000zeri. 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 whileciclo. Un forloop è ancora veloce, ma un whileloop è solo leggermente più veloce (un paio di ms) - e più pulito.

Risposte come quelle di Wilco, Aleksandar Topleko Vitim.usfaranno 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 Topleko 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'

L'ho messo in un jsfiddle per rendere più veloce il test degli altri, aggiungendo la tua versione del codice: jsfiddle.net/kevinmicke/vnvghw7y/2 La tua versione è sempre molto competitiva, e talvolta la più veloce. Grazie per i test abbastanza esaustivi.
kevinmicke,

8

Il primo parametro è qualsiasi numero reale, il secondo parametro è un numero intero positivo che specifica il numero minimo di cifre a sinistra del punto decimale e il terzo parametro è un numero intero opzionale che specifica il numero se cifre a destra del punto decimale.

function zPad(n, l, r){
    return(a=String(n).match(/(^-?)(\d*)\.?(\d*)/))?a[1]+(Array(l).join(0)+a[2]).slice(-Math.max(l,a[2].length))+('undefined'!==typeof r?(0<r?'.':'')+(a[3]+Array(r+1).join(0)).slice(0,r):a[3]?'.'+a[3]:''):0
}

così

           zPad(6, 2) === '06'
          zPad(-6, 2) === '-06'
       zPad(600.2, 2) === '600.2'
        zPad(-600, 2) === '-600'
         zPad(6.2, 3) === '006.2'
        zPad(-6.2, 3) === '-006.2'
      zPad(6.2, 3, 0) === '006'
        zPad(6, 2, 3) === '06.000'
    zPad(600.2, 2, 3) === '600.200'
zPad(-600.1499, 2, 3) === '-600.149'


8

Questa è la soluzione ES6.

function pad(num, len) {
  return '0'.repeat(len - num.toString().length) + num;
}
alert(pad(1234,6));


Chiaramente la soluzione più elegante la modificherei per evitare conversioni di 2 stringhe: const numStr = String(num)ereturn '0'.repeat(len - numStr.length) + numStr;
ngryman il

8

In tutti i browser moderni è possibile utilizzare

numberStr.padStart(numberLength, "0");

function zeroFill(num, numLength) {
  var numberStr = num.toString();

  return numberStr.padStart(numLength, "0");
}

var numbers = [0, 1, 12, 123, 1234, 12345];

numbers.forEach(
  function(num) {
    var numString = num.toString();
    
    var paddedNum = zeroFill(numString, 5);

    console.log(paddedNum);
  }
);

Ecco il riferimento MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart


5

Non che questa domanda abbia bisogno di più risposte, ma ho pensato di aggiungere la semplice versione lodash di questo.

_.padLeft(number, 6, '0')


1
Meglio:var zfill = _.partialRight(_.padStart, '0');
Droogans

3
Alcune persone probabilmente protesteranno "Non voglio usare lodash" ma non è più un argomento valido dal momento che puoi installare solo questa funzione:, npm install --save lodash.padleftquindi, import padLeft from 'lodash.padleft'e ometti_.
Andy,

5

L'ultimo modo per farlo è molto più semplice:

var number = 2
number.toLocaleString(undefined, {minimumIntegerDigits:2})

output: "02"


(8).toLocaleString(undefined, {minimumIntegerDigits: 5})ritorna "00.008"per me, in base alla mia lingua.
le_m


4

Questo è meno nativo, ma potrebbe essere il più veloce ...

zeroPad = function (num, count) {
    var pad = (num + '').length - count;
    while(--pad > -1) {
        num = '0' + num;
    }
    return num;
};

penso che tu voglia fare pad = count - (num + '').length. i numeri negativi non sono gestiti bene, ma a parte questo, non è male. +1
nickf

3

La mia soluzione

Number.prototype.PadLeft = function (length, digit) {
    var str = '' + this;
    while (str.length < length) {
        str = (digit || '0') + str;
    }
    return str;
};

uso

var a = 567.25;
a.PadLeft(10); // 0000567.25

var b = 567.25;
b.PadLeft(20, '2'); // 22222222222222567.25

3

Perché non usare la ricorsione?

function padZero(s, n) {
    s = s.toString(); // in case someone passes a number
    return s.length >= n ? s : padZero('0' + s, n);
}

padZero (223, 3) fallisce con '0223'
Serginho,

Bene, ho assunto che questa funzione sia chiamata con una stringa come primo parametro. Tuttavia, l'ho risolto.
lex82,

2

Alcuni monkeypatch funzionano anche

String.prototype.padLeft = function (n, c) {
  if (isNaN(n))
    return null;
  c = c || "0";
  return (new Array(n).join(c).substring(0, this.length-n)) + this; 
};
var paddedValue = "123".padLeft(6); // returns "000123"
var otherPadded = "TEXT".padLeft(8, " "); // returns "    TEXT"

1
-1 il monkeypatching dello spazio dei nomi di livello superiore in javascript è una cattiva pratica.
Jeremy Wall,

2
Vero per oggetti Object e Array, ma String non è male
Rodrigo,

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 // don't pad if not necessary

pad('S', 'O', 2) = SO

...eccetera.

Saluti


Penso che dovrebbe essere più simile: var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;se lo aggiusti rimuoverò il mio voto negativo.
sorteggiato

@drewish Grazie per averlo colto, sono d'accordo con la tua modifica (ad eccezione del 0char di join hardcoded :) - Risposta aggiornata.
Madbreaks,

Penso che sarebbe meglio archiviare la stringa in una variabile temporanea. Ho fatto alcuni benchmarking qui: jsperf.com/padding-with-memoization ha anche dei benchmark per l'uso del nuovo in "new Array" i risultati per il nuovo sono dappertutto ma la memiozation sembra la strada da percorrere.
sbalorditivo

2

La soluzione più semplice e diretta che troverai.

function zerofill(number,length) {
    var output = number.toString();
    while(output.length < length) {
      output = '0' + output;
    }
    return output;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.