837 votes

Comment afficher des nombres avec des zéros en tête en JavaScript ?

Existe-t-il un moyen de faire précéder les nombres de zéros non significatifs afin d'obtenir une chaîne de longueur fixe ? Par exemple, 5 devient "05" si je spécifie 2 endroits.

176 votes

J'ai trouvé ce ce qui, je pense, est beaucoup plus simple : ("00" + h).slice (-3);

12 votes

@PauloBueno ("00" + 1234).slice (-3); donne 234 c'est-à-dire qu'il élimine le chiffre le plus significatif.

19 votes

@DanielEarwicker Bien sûr que oui, mais vous devez vous adapter au nombre de chiffres que vous attendez. ("000" + 1234).slice(-4) , ("0000" + 12345).slice(-5) et ainsi de suite...

979voto

InfinitiesLoop Points 4005

NOTE : Potentiellement périmé. ECMAScript 2017 comprend String.prototype.padStart .

Vous devrez convertir le nombre en chaîne de caractères, car les nombres n'ont pas de sens avec des zéros en tête. Quelque chose comme ça :

function pad(num, size) {
    num = num.toString();
    while (num.length < size) num = "0" + num;
    return num;
}

Ou, si vous savez que vous n'utiliserez jamais plus d'un nombre X de zéros, c'est peut-être mieux. Cela suppose que vous ne voudrez jamais plus de 10 chiffres.

function pad(num, size) {
    var s = "000000000" + num;
    return s.substr(s.length-size);
}

Si vous vous préoccupez des nombres négatifs, vous devrez supprimer la fonction - et le lire.

150 votes

Deuxième fonction ; plus courte : function pad(num, size){ return ('000000000' + num).substr(-size); }

10 votes

Les valeurs négatives ne fonctionnent pas dans de nombreuses versions d'IE.

9 votes

Ah, apparemment slice() fonctionne avec des valeurs négatives dans IE cependant :) stackoverflow.com/questions/2243824/

665voto

CMS Points 315406

UPDATE : Petite fonction one-liner utilisant l'ES2017 String.prototype.padStart méthode :

const zeroPad = (num, places) => String(num).padStart(places, '0')

console.log(zeroPad(5, 2)); // "05"
console.log(zeroPad(5, 4)); // "0005"
console.log(zeroPad(5, 6)); // "000005"
console.log(zeroPad(1234, 2)); // "1234"

Une autre approche ES5 :

function zeroPad(num, places) {
  var zero = places - num.toString().length + 1;
  return Array(+(zero > 0 && zero)).join("0") + num;
}

zeroPad(5, 2); // "05"
zeroPad(5, 4); // "0005"
zeroPad(5, 6); // "000005"
zeroPad(1234, 2); // "1234" :)

1 votes

Vous ne tenez pas compte des tailles négatives des tableaux ;) eg zeroPad(1234, 2) -> RangeError: Invalid array length

3 votes

Selon ce benchmark, cette méthode est 5 fois plus lente que la solution acceptée : gist.github.com/4382935

2 votes

J'aime le code, mais il semble être plus lent dans Chrome. J'aimerais voir les résultats avec d'autres navigateurs : jsperf.com/zero-padding-number-methods (en anglais)

269voto

Mild Fuzz Points 6864

Vous pourriez étendre le Number objet :

Number.prototype.pad = function(size) {
    var s = String(this);
    while (s.length < (size || 2)) {s = "0" + s;}
    return s;
}

Exemples :

(9).pad();  //returns "09"

(7).pad(3);  //returns "007"

1 votes

Je pense que c'est exactement ce dont j'ai besoin. L'argument "size" fait référence au nombre de caractères FINAL et non au nombre total de zéros à ajouter, n'est-ce pas ?

0 votes

Oui, c'est vrai, il vérifie la longueur totale et la compare.

0 votes

Oui, ça dépend de l'endroit où vous l'utilisez. Ce n'est pas une mauvaise chose en soi, mais si on l'utilise dans un espace avec beaucoup d'implication de tiers, il y a un risque potentiel d'écrasement de la fonctionnalité.

69voto

dave1010 Points 6595

De https://gist.github.com/1180489

function pad(a, b){
  return(1e15 + a + '').slice(-b);
}

Avec des commentaires :

function pad(
  a, // the number to convert 
  b // number of resulting characters
){
  return (
    1e15 + a + // combine with large number
    "" // convert to string
  ).slice(-b) // cut leading "1"
}

58 votes

C'est une bonne chose, mais elle a un défaut fatal. Par exemple, pad (1234, 3) === "234" ! Ce qui est évidemment inacceptable.

4 votes

Il ne fonctionne pas non plus si vous souhaitez un remplissage supérieur à 15. Élégant, mais assez peu flexible.

1 votes

@dave1010 J'ai eu un mauvais résultat. pad(1234) donne "1000000000001234" . avec paramètre pad(1234,20) donne "1000000000001234" Merci @Brock Adams

5voto

Christoph Points 64389

Juste pour le plaisir (j'avais du temps à tuer), une implémentation plus sophistiquée qui met en cache la chaîne zéro :

pad.zeros = new Array(5).join('0');
function pad(num, len) {
    var str = String(num),
        diff = len - str.length;
    if(diff <= 0) return str;
    if(diff > pad.zeros.length)
        pad.zeros = new Array(diff + 1).join('0');
    return pad.zeros.substr(0, diff) + str;
}

Si le nombre de rembourrages est important et que la fonction est appelée assez souvent, elle est en fait plus performante que les autres méthodes...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X