J'essaie d'imprimer un entier en JavaScript avec des virgules comme des milliers de séparateurs. Par exemple, je veux afficher le numéro 1234567 comme "1 234 567". Comment pourrais-je procéder?
Voici comment je le fais:
function numberWithCommas(x) {
x = x.toString();
var pattern = /(-?\d+)(\d{3})/;
while (pattern.test(x))
x = x.replace(pattern, "$1,$2");
return x;
}
Existe-t-il une manière plus simple ou plus élégante de le faire? Ce serait bien si cela fonctionne avec des flotteurs également, mais ce n'est pas nécessaire. Il n'est pas nécessaire qu'il soit spécifique aux paramètres régionaux pour choisir entre les périodes et les virgules.
javascript
formatting
numbers
Elias Zamaria
la source
la source
Number.prototype.toLocaleString
toujours pas dans Safari, en 2016 . Au lieu de formater réellement le nombre, il le renvoie simplement, sans erreur. Avoir le plus grand facepalm aujourd'hui à la suite de cela ... #goodworkAppleRéponses:
J'ai utilisé l'idée de la réponse de Kerry, mais je l'ai simplifiée car je cherchais simplement quelque chose de simple pour mon objectif spécifique. Voici ce que j'ai fait:
Afficher l'extrait de code
L'expression régulière utilise 2 assertions d'anticipation:
Par exemple, si vous la réussissez
123456789.01
, l'assertion positive correspondra à chaque point à gauche du 7 (puisqu'il789
s'agit d'un multiple de 3 chiffres,678
est un multiple de 3 chiffres567
, etc.). L'assertion négative vérifie que le multiple de 3 chiffres n'a pas de chiffres après.789
a un point après, donc c'est exactement un multiple de 3 chiffres, donc une virgule y va.678
est un multiple de 3 chiffres mais il a un9
après, donc ces 3 chiffres font partie d'un groupe de 4, et une virgule n'y va pas. De même pour567
.456789
est de 6 chiffres, ce qui est un multiple de 3, donc une virgule précède.345678
est un multiple de 3, mais il a un9
après, donc aucune virgule n'y va. Etc. le\B
empêche l'expression régulière de mettre une virgule au début de la chaîne.@ neu-rah a mentionné que cette fonction ajoute des virgules aux endroits indésirables s'il y a plus de 3 chiffres après la virgule décimale. Si c'est un problème, vous pouvez utiliser cette fonction:
Afficher l'extrait de code
@ tjcrowder a souligné que maintenant que JavaScript a du retard ( informations de support ), il peut être résolu dans l'expression régulière elle-même:
Afficher l'extrait de code
(?<!\.\d*)
est un lookbehind négatif qui dit que la correspondance ne peut pas être précédée d'un.
suivi de zéro ou plusieurs chiffres. Le lookbehind négatif est plus rapide que la solutionsplit
etjoin
( comparaison ), du moins en V8.la source
Je suis surpris que personne n'ait mentionné Number.prototype.toLocaleString . Il est implémenté dans JavaScript 1.5 (qui a été introduit en 1999), il est donc essentiellement pris en charge par tous les principaux navigateurs.
Il fonctionne également dans Node.js à partir de la v0.12 via l'inclusion d' Intl
Faites juste attention à ce que cette fonction renvoie une chaîne, pas un nombre.
Si vous voulez quelque chose de différent, Numeral.js pourrait être intéressant.
la source
var number = 123456.000; number.toLocaleString('en-US', {minimumFractionDigits: 2}); "123,456.00"
ces options ne fonctionnent cependant pas dans FF ou Safari.X XXX XXX,YYY
).toLocaleString
fonctionne dans Node.js à partir de la v0.12 via l' inclusion d'Intl .parseInt("1234567", 10).toLocaleString('en-US', {minimumFractionDigits: 2})
ou à lanew Number("1234567").toLocaleString('en-US', {minimumFractionDigits: 2})
place. Cela ne fonctionne pas car vous l'utilisez sur une chaîne, pas sur un nombre.⚠ Gardez à l'esprit que javascript a une valeur entière maximale de 9007199254740991
toLocaleString :
NumberFormat ( Safari non pris en charge):
D'après ce que j'ai vérifié (Firefox au moins), ils sont tous deux plus ou moins identiques en termes de performances.
la source
toLocaleString
travaux de base sur le safari, les options ne le font pastoLocaleString
solution devrait probablement également inclure les paramètres régionaux souhaitéstoLocaleString("en")
, car le modèle anglais utilise des virgules. Cependant, si l'toLocaleString()
indicateur de locale n'est pas exécuté en France, il produira des périodes au lieu de virgules car c'est ce qui est utilisé pour séparer des milliers localement.Je suggère d'utiliser number_format () de phpjs.org
MISE À JOUR 13/02/14
Les gens ont signalé que cela ne fonctionnait pas comme prévu, j'ai donc fait un JS Fiddle qui comprend des tests automatisés.
Mise à jour 26/11/2017
Voici ce violon en tant qu'extrait de pile avec une sortie légèrement modifiée:
la source
Il s'agit d'une variante de la réponse de @ mikez302, mais modifiée pour prendre en charge les nombres avec des décimales (selon les commentaires de @ neu-rah que numberWithCommas (12345.6789) -> "12,345.6,789" au lieu de "12,345.6789"
la source
la source
Utilisation de l'expression régulière
Utilisation de toLocaleString ()
ref MDN: Number.prototype.toLocaleString ()
Utilisation de Intl.NumberFormat ()
ref Intl.NumberFormat
DÉMO ICI
Performance
http://jsben.ch/sifRd
la source
Intl.NumberFormat
Fonction JS native. Pris en charge par IE11, Edge, les derniers Safari, Chrome, Firefox, Opera, Safari sur iOS et Chrome sur Android.
la source
Merci à tous pour leurs réponses. J'ai construit à partir de certaines des réponses pour faire une solution plus «taille unique».
Le premier extrait ajoute une fonction qui imite PHP « s
number_format()
au prototype numérique. Si je mets en forme un nombre, je veux généralement des décimales afin que la fonction prenne le nombre de décimales à afficher. Certains pays utilisent des virgules comme décimales et des décimales comme séparateur de milliers, de sorte que la fonction permet de définir ces séparateurs.Vous utiliseriez ceci comme suit:
J'ai trouvé que j'avais souvent besoin de récupérer le nombre pour les opérations mathématiques, mais parseFloat convertit 5 000 en 5, en prenant simplement la première séquence de valeurs entières. J'ai donc créé ma propre fonction de conversion flottante et l'ai ajoutée au prototype String.
Vous pouvez maintenant utiliser les deux fonctions comme suit:
la source
var parts = this.toFixed(decimals).toString().split('.');
var dec_point
. Merci d'avoir fait remarquer cela.Je suis assez impressionné par le nombre de réponses à cette question. J'aime la réponse de uKolka :
Mais malheureusement, dans certains endroits comme l'espagnol, cela ne fonctionne pas (à mon humble avis) comme prévu pour les nombres inférieurs à 10 000:
Donne
1000
et non1.000
.Voir toLocaleString ne fonctionnant pas sur des nombres inférieurs à 10000 dans tous les navigateurs pour savoir pourquoi.
J'ai donc dû utiliser la réponse d' Elias Zamaria choisissant le bon séparateur de milliers:
Celui-ci fonctionne bien comme une ligne pour les deux paramètres régionaux qui utilisent
,
ou.
comme séparateur de milliers et commence à fonctionner à partir de 1000 dans tous les cas.Donne
1.000
avec un contexte local espagnol.Si vous souhaitez avoir un contrôle absolu sur la façon dont un nombre est formaté, vous pouvez également essayer ce qui suit:
Donne
1,234.57
.Celui-ci n'a pas besoin d'une expression régulière. Cela fonctionne en ajustant le nombre à la quantité de décimales souhaitée avec d'
toFixed
abord, puis en le divisant autour du point décimal.
s'il y en a un. Le côté gauche est ensuite transformé en un tableau de chiffres qui est inversé. Ensuite, un séparateur de milliers est ajouté tous les trois chiffres depuis le début et le résultat est inversé à nouveau. Le résultat final est l'union des deux parties. Le signe du numéro saisi est supprimé avecMath.abs
abord puis remis si nécessaire.Ce n'est pas une doublure mais pas beaucoup plus longtemps et facilement transformable en fonction. Des variables ont été ajoutées pour plus de clarté, mais celles-ci peuvent être remplacées par leurs valeurs souhaitées si elles sont connues à l'avance. Vous pouvez utiliser les expressions qui
toLocaleString
permettent de trouver les bons caractères pour le point décimal et le séparateur de milliers pour les paramètres régionaux actuels (gardez à l'esprit que ceux-ci nécessitent un Javascript plus moderne.)la source
Je pense que c'est l'expression régulière la plus courte qui le fait:
Je l'ai vérifié sur quelques chiffres et cela a fonctionné.
la source
Number.prototype.toLocaleString()
aurait été génial s'il était fourni nativement par tous les navigateurs (Safari) .J'ai vérifié toutes les autres réponses mais personne ne semblait les remplir. Voici un poc vers cela, qui est en fait une combinaison des deux premières réponses; si
toLocaleString
cela fonctionne, il l'utilise, sinon, il utilise une fonction personnalisée.la source
0.12345
affichera0.12,345
. Une bonne implémentation pour cela peut être trouvée dans le underscore.stringvalue > 1000
à la condition if corrige ce cas, mais c'était un poc et bien sûr, des versions mieux testées peuvent être trouvées ailleurs, merci de le souligner.value > 1000
, car ce serait la même chose pour n'importe quel nombre et plus de 3 décimales. par exemple les1000.12345
retours1,000.12,345
. Votre réponse est excellente et sur la bonne voie, mais tout simplement incomplète. J'essayais simplement de signaler à d'autres personnes qui pourraient tomber sur votre réponse et simplement la copier / la coller sans la tester avec différentes données d'entrée.Le séparateur de milliers peut être inséré de manière conviviale à l'international en utilisant l'
Intl
objet du navigateur :Voir l'article de MDN sur NumberFormat pour plus d'informations, vous pouvez spécifier le comportement local ou par défaut celui de l'utilisateur. C'est un peu plus à toute épreuve car il respecte les différences locales; de nombreux pays utilisent des points pour séparer les chiffres tandis qu'une virgule indique les décimales.
Intl.NumberFormat n'est pas encore disponible dans tous les navigateurs, mais il fonctionne dans les derniers Chrome, Opera et IE. La prochaine version de Firefox devrait la prendre en charge. Webkit ne semble pas avoir de calendrier de mise en œuvre.
la source
Vous pouvez utiliser cette procédure pour formater votre devise.
Pour plus d'informations, vous pouvez accéder à ce lien.
https://www.justinmccandless.com/post/formatting-currency-in-javascript/
la source
Si vous traitez beaucoup avec des valeurs monétaires et que vous formatez beaucoup, il peut être utile d'ajouter de minuscules accounting.js qui gère beaucoup de cas marginaux et de localisation:
la source
Le code suivant utilise l'analyse des caractères, il n'y a donc pas d'expression régulière.
Il montre des performances prometteuses: http://jsperf.com/number-formatting-with-commas/5
2015.4.26: correction mineure pour résoudre le problème lorsque num <0. Voir https://jsfiddle.net/runsun/p5tqqvs3/
la source
commafy(-123456)
cela donne-,123,456
Voici une fonction simple qui insère des virgules pour mille séparateurs. Il utilise des fonctions de tableau plutôt qu'un RegEx.
Lien CodeSandbox avec des exemples: https://codesandbox.io/s/p38k63w0vq
la source
Utilisez ce code pour gérer le format de devise pour l'Inde. Le code du pays peut être modifié pour gérer la devise d'un autre pays.
production:
la source
Vous pouvez également utiliser le constructeur Intl.NumberFormat . Voici comment vous pouvez le faire.
la source
J'ai écrit celui-ci avant de tomber sur ce post. Aucun regex et vous pouvez réellement comprendre le code.
la source
EDIT: La fonction ne fonctionne qu'avec un nombre positif. pour exmaple:
Sortie: "123,123,231,232"
Mais pour répondre à la question ci-dessus, la
toLocaleString()
méthode ne fait que résoudre le problème.Sortie: "123,123,231,232"
Acclamation!
la source
Ma réponse est la seule réponse qui remplace complètement jQuery par une alternative beaucoup plus sensée:
Cette solution ajoute non seulement des virgules, mais elle arrondit également au centime le plus proche dans le cas où vous saisissez un montant comme
$(1000.9999)
vous obtiendrez 1001,00 $. De plus, la valeur que vous entrez peut être en toute sécurité un nombre ou une chaîne; ça n'a pas d'importance.Si vous avez affaire à de l'argent, mais que vous ne voulez pas qu'un signe dollar en tête s'affiche sur le montant, vous pouvez également ajouter cette fonction, qui utilise la fonction précédente mais supprime
$
:Si vous n'avez pas d'argent et que vous avez des exigences de formatage décimal variables, voici une fonction plus polyvalente:
Oh, et en passant, le fait que ce code ne fonctionne pas dans une ancienne version d'Internet Explorer est complètement intentionnel. J'essaye de casser IE à tout moment que je peux attraper ne supportant pas les normes modernes.
N'oubliez pas que les louanges excessives, dans la section des commentaires, sont considérées comme hors sujet. Au lieu de cela, arrosez-moi simplement de votes positifs.
la source
Pour moi, la meilleure réponse est d'utiliser toLocaleString comme certains membres l'ont dit. Si vous souhaitez inclure le symbole «$», ajoutez simplement languaje et tapez les options. Voici et exemple pour formater un nombre en pesos mexicains
raccourci
la source
Permettez-moi d'essayer d'améliorer la réponse d' uKolka et peut-être d'aider les autres à gagner du temps.
Utilisez Numeral.js .
Vous ne devez utiliser Number.prototype.toLocaleString () que si la compatibilité de son navigateur n'est pas un problème.
la source
Une manière alternative, en prenant en charge les décimales, différents séparateurs et négatifs.
Quelques corrections de @Jignesh Sanghani, n'oubliez pas de voter pour son commentaire.
la source
fn.substr(0, i)
remplacer parn.substr(0, i)
et égalementnumber.toFixed(dp).split('.')[1]
remplacer parparseFloat(number).toFixed(dp).split('.')[1]
. parce que quand j'utilise directement ça me donne une erreur. veuillez mettre à jour votre codeJe pense que cette fonction prendra en charge tous les problèmes liés à ce problème.
la source
Juste pour les futurs Googleurs (ou pas nécessairement les «Googleurs»):
Toutes les solutions mentionnées ci-dessus sont merveilleuses, cependant, RegExp peut être une très mauvaise chose à utiliser dans une situation comme celle-ci.
Donc, oui, vous pouvez utiliser certaines des options proposées ou même écrire quelque chose de primitif mais utile comme:
L'expression rationnelle utilisée ici est assez simple et la boucle ira précisément le nombre de fois qu'il faut pour faire le travail.
Et vous pourriez l'optimiser bien mieux, le code "DRYify", etc.
Encore,
(dans la plupart des situations) serait un bien meilleur choix.
Le point n'est pas dans la vitesse d'exécution ou dans la compatibilité entre les navigateurs.
Dans les situations où vous souhaitez afficher le numéro résultant à l'utilisateur, la méthode .toLocaleString () vous donne le super pouvoir de parler la même langue avec l'utilisateur de votre site Web ou application (quelle que soit sa langue).
Cette méthode, selon la documentation ECMAScript, a été introduite en 1999, et je pense que cela s'expliquait par l'espoir qu'Internet, à un moment donné, connectera les gens du monde entier, donc, certains outils "d'internalisation" étaient nécessaires.
Aujourd'hui, Internet nous connecte tous, il est donc important de se rappeler que le monde est un moyen plus complexe que nous pourrions imaginer et que (/ presque) nous sommes tous ici , sur Internet.
Évidemment, compte tenu de la diversité des personnes, il est impossible de garantir une UX parfaite pour tout le monde parce que nous parlons différentes langues, valorisons des choses différentes, etc. Et précisément à cause de cela, il est encore plus important d'essayer de localiser les choses autant que possible .
Donc, étant donné qu'il existe des normes particulières pour la représentation de la date, de l'heure, des nombres, etc. et que nous avons un outil pour afficher ces choses dans le format préféré par l'utilisateur final, n'est-ce pas rare et presque irresponsable de ne pas utiliser cet outil (surtout dans les situations où nous voulons afficher ces données à l'utilisateur)?
Pour moi, utiliser RegExp au lieu de .toLocaleString () dans une situation comme celle-ci ressemble un peu à créer une application d'horloge avec JavaScript et à la coder en dur de telle sorte qu'elle n'affichera que l'heure de Prague (ce qui serait tout à fait inutile pour personnes qui ne vivent pas à Prague) même si le comportement par défaut de
consiste à renvoyer les données en fonction de l'horloge de l'utilisateur final.
la source
Ma « vraie » solution d'expressions régulières pour ceux qui aiment les lignes simples
Vous voyez ces joueurs enthousiastes ci-dessus? Peut-être que vous pouvez jouer au golf. Voici mon coup.
Utilise un
ESPACE MINCE (U + 2009) pour un séparateur de milliers, comme le système international d'unités l'a dit dans la huitième édition (2006) de leur publication « Brochure SI: Le système international d'unités (SI) » (voir §5.3 .4.). La neuvième édition (2019) propose d'y utiliser un espace (voir §5.4.4.). Vous pouvez utiliser ce que vous voulez, y compris une virgule.
Voir.
Comment ça marche?
Pour une partie entière
.replace(……, " I ")
Mettez "je"/……/g
à chacun\B
l'entre-deux de deux chiffres adjacents(?=……)
LOOKAHEAD POSITIF dont la partie droite est(\d{3})+
un ou plusieurs morceaux à trois chiffres\b
suivi d'un non-chiffre, comme un point, la fin de la chaîne, et cetera,(?<!……)
REGARD NÉGATIF excluant ceux dont la partie gauche\.\d+
est un point suivi de chiffres («a un séparateur décimal»).Pour une partie décimale
.replace(……, " F ")
Mettez "F"/……/g
à chacun\B
l'entre-deux de deux chiffres adjacents(?<=……)
REGARD POSITIF dont la partie gauche est\.
un séparateur décimal(\d{3})+
suivi d'un ou plusieurs morceaux à trois chiffres.Classes de caractères et limites
Compatibilité du navigateur
la source
J'ai ajouté tofixed à la solution d' Aki143S . Cette solution utilise des points pour des milliers de séparateurs et des virgules pour la précision.
Exemples;
la source
Beaucoup de bonnes réponses déjà. En voici une autre, juste pour le plaisir:
Quelques exemples:
la source
format(-123456)
cela donne-,123,456