Quelle est la méthode recommandée pour remplir une valeur en JavaScript? J'imagine que je pourrais créer une fonction personnalisée pour ajouter des zéros à une valeur transtypée, mais je me demande s'il existe un moyen plus direct de le faire?
Remarque: Par "zerofilled", je veux dire dans le sens de base de données du mot (où une représentation zerofilled à 6 chiffres du nombre 5 serait "000005").
javascript
zerofill
Wilco
la source
la source
npm install sprintf-js
-le et exigez-le dans le fichier dont vous avez besoin:sprintf('%0d6', 5);
function padWithZeroes(n, width) { while(n.length<width) n = '0' + n; return n;}
... en supposant qu'iln
ne soit pas négatifwhile
afin d'accéder àn.length
mynum = "0".repeat((n=6-mynum.toString().length)>0?n:0)+mynum;
Réponses:
Une fonction simple est tout ce dont vous avez besoin
vous pouvez faire cuire cela dans une bibliothèque si vous souhaitez conserver l'espace de noms ou autre. Comme avec l'extension de jQuery .
la source
Manière simple. Vous pouvez ajouter une multiplication de chaînes pour le pad et le transformer en fonction.
En tant que fonction,
la source
paddy (888, 2)
rendements88
et pas888
comme requis. Cette réponse ne gère pas non plus les nombres négatifs.Je ne peux pas croire toutes les réponses complexes ici ... Utilisez simplement ceci:
la source
En fait, j'ai dû trouver quelque chose comme ça récemment. J'ai pensé qu'il devait y avoir un moyen de le faire sans utiliser de boucles.
C'est ce que j'ai trouvé.
Ensuite, utilisez-le simplement en fournissant un nombre à zéro:
Si le nombre est supérieur au remplissage, le nombre s'étendra au-delà du remplissage:
Les décimales sont bien aussi!
Si cela ne vous dérange pas de polluer l'espace de noms global, vous pouvez l'ajouter directement à Number:
Et si vous préférez que les décimales occupent de l'espace dans le rembourrage:
À votre santé!
XDR a proposé une variation logarithmique qui semble mieux fonctionner.
AVERTISSEMENT : cette fonction échoue si num est égal à zéro (par exemple zeropad (0, 2))
En parlant de performance, tomsmeding a comparé les 3 premières réponses ( 4 avec la variation du journal ). Devinez lequel a largement surpassé les deux autres? :)
la source
numZeros
paramètre, car il est trompeur. Ce n'est pas le nombre de zéros que vous voulez ajouter, c'est la longueur minimale du nombre. Un meilleur nom seraitnumLength
ou mêmelength
.num
peut être nulle ...Voici ce que j'avais l'habitude de remplir jusqu'à 7 caractères.
Cette approche suffira probablement à la plupart des gens.
Edit: Si vous voulez le rendre plus générique, vous pouvez le faire:
Edit 2: Notez que depuis ES2017, vous pouvez utiliser
String.prototype.padStart
:la source
number = 123456789
, avec le code ci-dessus, par exemple.new String
. Vous pouvez simplement utiliser des littéraux de chaîne.(new Array(padding + 1).join("0")
peut être remplacé par"0".repeat(padding)
Les navigateurs modernes prennent désormais en charge
padStart
, vous pouvez simplement faire maintenant:Exemple:
la source
Malheureusement, il y a beaucoup de suggestions compliquées inutiles pour ce problème, impliquant généralement l'écriture de votre propre fonction pour faire des mathématiques ou une manipulation de chaînes ou appeler un utilitaire tiers. Cependant, il existe un moyen standard de le faire dans la bibliothèque JavaScript de base avec une seule ligne de code. Il peut être utile d'envelopper cette seule ligne de code dans une fonction pour éviter d'avoir à spécifier des paramètres que vous ne souhaitez jamais modifier, comme le nom ou le style local.
Cela produira la valeur de "005" pour le texte. Vous pouvez également utiliser la fonction toLocaleString de Number pour ajouter des zéros à droite du séparateur décimal.
Cela produira la valeur de "5,00" pour le texte. Remplacez useGrouping par true pour utiliser des séparateurs de virgules pour des milliers.
Notez que l'utilisation
toLocaleString()
delocales
et desoptions
arguments est normalisée séparément dans ECMA-402 , pas dans ECMAScript. À ce jour, certains navigateurs n'implémentent que le support de base , c'esttoLocaleString()
-à- dire peuvent ignorer tous les arguments.Exemple complet
la source
Si le nombre de remplissage est connu à l'avance pour ne pas dépasser une certaine valeur, il existe une autre façon de le faire sans boucles:
Cas de test ici: http://jsfiddle.net/jfriend00/N87mZ/
la source
-88
devrait céder"-00088"
, par exemple.zeroFill(-88, 5)
devrait produire-00088
ou-0088
? Je suppose que cela dépend si vous voulez que l'width
argument soit la largeur entière du nombre ou juste le nombre de chiffres (sans compter le signe négatif). Un implémenteur peut facilement changer le comportement pour ne pas inclure le signe négatif en supprimant simplement la--width
ligne de code.La manière rapide et sale:
Pour x = 5 et count = 6, vous aurez y = "000005"
la source
y="0005"
avec ce qui précède,y = (new Array(count + 1 - x.toString().length)).join('0') + x;
c'est ce qui m'a donnéy="000005"
('0000'+n).slice(-4)
Voici une fonction rapide que j'ai trouvée pour faire le travail. Si quelqu'un a une approche plus simple, n'hésitez pas à partager!
la source
for
.vs.while
les performances ne sont pas assez différentes pour être intéressantes: jsperf.com/fors-vs- whileTard dans la fête ici, mais j'utilise souvent cette construction pour faire un remplissage ad hoc d'une certaine valeur
n
, connue pour être une décimale positive:Où
offset
est 10 ^^ chiffres.Par exemple, remplissage à 5 chiffres, où n = 123:
La version hexidécimale de ceci est légèrement plus détaillée:
Note 1: J'aime aussi la solution de @ profitehlolz, qui est la version chaîne de ceci, utilisant la fonctionnalité astucieuse d'index négatif de slice ().
la source
Je ne sais vraiment pas pourquoi, mais personne ne l'a fait de la manière la plus évidente. Voici mon implémentation.
Une fonction:
Prototype:
Très simple, je ne vois pas comment cela peut être plus simple. Pour une raison quelconque, il me semble que plusieurs fois ici sur SO, les gens essaient juste d'éviter les boucles "pour" et "tandis que" à tout prix. L'utilisation de regex coûtera probablement beaucoup plus de cycles pour un remplissage aussi simple à 8 chiffres.
la source
J'utilise ce snipet pour obtenir une représentation à 5 chiffres
la source
ECMAScript 2017: utilisez padStart ou padEnd
Plus d'informations:
la source
Le pouvoir des mathématiques!
x = entier à remplir
y = nombre de zéros à remplir
la source
Je n'ai vu personne souligner le fait que lorsque vous utilisez String.prototype.substr () avec un nombre négatif, il compte à droite.
Une solution à une réponse à la question du PO, une représentation à 6 chiffres remplie de zéros du nombre 5, est:
En généralisant, nous obtiendrons:
la source
Après un long, très long test de 15 fonctions / méthodes différentes trouvées dans les réponses à ces questions, je sais maintenant laquelle est la meilleure (la plus polyvalente et la plus rapide).
J'ai pris 15 fonctions / méthodes à partir des réponses à cette question et fait un script pour mesurer le temps nécessaire pour exécuter 100 pads. Chaque pavé remplirait le nombre
9
de2000
zéros. Cela peut sembler excessif, et c'est le cas, mais cela vous donne une bonne idée de la mise à l'échelle des fonctions.Le code que j'ai utilisé se trouve ici: https://gist.github.com/NextToNothing/6325915
N'hésitez pas à modifier et tester le code vous-même.
Afin d'obtenir la méthode la plus polyvalente, vous devez utiliser une boucle. En effet, avec un très grand nombre, d'autres sont susceptibles d'échouer, alors que cela réussira.
Alors, quelle boucle utiliser? Eh bien, ce serait une
while
boucle. Unefor
boucle est toujours rapide, mais unewhile
boucle est juste un peu plus rapide (quelques ms) - et plus propre.Des réponses comme celles de
Wilco
,Aleksandar Toplek
ouVitim.us
feront parfaitement l'affaire.Personnellement, j'ai essayé une approche différente. J'ai essayé d'utiliser une fonction récursive pour remplir la chaîne / le nombre. Cela fonctionnait mieux que les méthodes joignant un tableau mais, toujours, ne fonctionnait pas aussi rapidement qu'une boucle for.
Ma fonction est:
Vous pouvez utiliser ma fonction avec ou sans définir la variable de remplissage. Alors comme ça:
Personnellement, après mes tests, j'utiliserais une méthode avec une boucle while, comme
Aleksandar Toplek
ouVitim.us
. Cependant, je le modifierais légèrement pour que vous puissiez définir la chaîne de remplissage.Donc, j'utiliserais ce code:
Vous pouvez également l'utiliser comme fonction prototype, en utilisant ce code:
la source
Le premier paramètre est un nombre réel, le deuxième paramètre est un entier positif spécifiant le nombre minimum de chiffres à gauche de la virgule décimale et le troisième paramètre est un entier positif facultatif spécifiant le nombre si les chiffres se trouvent à droite de la virgule décimale.
donc
la source
Ne réinventez pas la roue, utilisez la chaîne de soulignement :
jsFiddle
la source
Ceci est la solution ES6.
la source
const numStr = String(num)
etreturn '0'.repeat(len - numStr.length) + numStr;
Dans tous les navigateurs modernes, vous pouvez utiliser
Voici la référence MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/padStart
la source
Non pas que cette question nécessite plus de réponses, mais j'ai pensé que j'ajouterais la version lodash simple de cela.
_.padLeft(number, 6, '0')
la source
var zfill = _.partialRight(_.padStart, '0');
npm install --save lodash.padleft
puisimport padLeft from 'lodash.padleft'
et omettre le_.
La dernière façon de le faire est beaucoup plus simple:
output: "02"
la source
(8).toLocaleString(undefined, {minimumIntegerDigits: 5})
revient"00.008"
pour moi, en fonction de mes paramètres régionaux.Juste une autre solution, mais je pense qu'elle est plus lisible.
la source
Celui-ci est moins natif, mais peut-être le plus rapide ...
la source
pad = count - (num + '').length
. les nombres négatifs ne sont pas bien gérés, mais à part cela, ce n'est pas mauvais. +1Ma solution
Usage
la source
Pourquoi ne pas utiliser la récursivité?
la source
Certains monkeypatching fonctionnent également
la source
pad(5, 0, 6)
=000005
pad('10', 0, 2)
=10 // don't pad if not necessary
pad('S', 'O', 2)
=SO
...etc.
À votre santé
la source
var s = String(toPad); return (s.length < length) ? new Array(length - s.length + 1).join('0') + s : s;
si vous le corrigez, je retirerai mon vote négatif.0
jointure codé en dur :) - Réponse mise à jour.La solution la plus simple et la plus simple que vous trouverez.
la source