174 votes

Ajouter une virgule aux numéros tous les trois chiffres

Comment formater les nombres en utilisant un séparateur de virgule tous les trois chiffres à l'aide de jQuery ?

Par exemple :

   Input      Output    

       298          298 
      2984        2,984 
 297312984  297,312,984

0 votes

Je suis novice en matière de jQuery et j'aimerais disposer d'une fonction/plugin simple qui ajoute simplement une virgule après tous les trois chiffres si les numéros ont plus de trois chiffres. Il s'agit uniquement de nombres positifs, pas de fractions, pas de décimales, pas de devises, et le format standard américain (1 111) et non (1 111 ou 1 111,11). Je préférerais que ce soit fait en utilisant jQuery et pas seulement javascript si possible et ce serait bien que le code soit défini dans une fonction pour qu'il puisse être appliqué très facilement. Comment dois-je m'y prendre ? J'apprécie les commentaires de chacun. Merci encore.

2 votes

@inconnu : Vous avez déjà de nombreuses réponses. Regardez les réponses que vous avez reçues et évaluez-les pour voir laquelle vous convient le mieux. Si vous avez besoin de plus de précisions sur l'une des réponses, postez-les en commentaire de cette réponse.

1 votes

Désolé, ma question n'était pas assez concise mais voyez le format du plugin de Doug Neiner utilisant le code de Paul Creasey pour la réponse.

261voto

Doug Neiner Points 34940

@Paul Creasey avait la solution la plus simple comme le regex, mais la voici comme un simple plugin jQuery :

$.fn.digits = function(){ 
    return this.each(function(){ 
        $(this).text( $(this).text().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") ); 
    })
}

Vous pourriez alors l'utiliser comme ceci :

$("span.numbers").digits();

4 votes

Fonctionne parfaitement ! Merci à Paul Creasey pour un code simple et élégant et merci à Doug Neiner pour l'avoir mis au format plugin. Crédit accordé aux deux.

4 votes

RC @Mark Byers La syntaxe est correcte. '999.9999'.replace(/( \d )(?=( \d\d\d )+( ?! \d ))/g, "$1,") renvoie cependant '999.9,999'.

0 votes

@bendewey l'OP n'a pas mis à jour sa question, mais il a ajouté ce commentaire "nombres positifs uniquement, pas de fractions, pas de décimales, pas de monnaie impliquée, et format standard américain" que la réponse de @Paul Creasey a fourni.

81voto

Paul Creasey Points 15663

Quelque chose comme ça si vous aimez les expressions rationnelles, je ne suis pas sûr de la syntaxe exacte pour le remplacement !

MyNumberAsString.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,");

2 votes

La syntaxe est correcte. '999.9999'.replace(/( \d )(?=( \d\d\d )+( ?! \d ))/g, "$1,") renvoie cependant '999.9,999'.

0 votes

@Inconnu, je l'ai déplacé vers une réponse. Elle est plus bas sur cette page avec un exemple d'utilisation.

27voto

Mark Byers Points 318575

Vous pouvez essayer NumberFormatter .

$(this).format({format:"#,###.00", locale:"us"});

Il prend également en charge différentes langues, dont bien sûr les États-Unis.

Voici un exemple très simplifié de son utilisation :

<html>
    <head>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript" src="jquery.numberformatter.js"></script>
        <script>
        $(document).ready(function() {
            $(".numbers").each(function() {
                $(this).format({format:"#,###", locale:"us"});
            });
        });
        </script>
    </head>
    <body>
        <div class="numbers">1000</div>
        <div class="numbers">2000000</div>
    </body>
</html>

Sortie :

1,000
2,000,000

0 votes

J'ai jeté un coup d'œil à ce plugin et d'après la description de l'auteur, il est destiné à être utilisé dans les champs de saisie des formulaires. Comment puis-je l'adopter pour l'appliquer à <span class="numbers">2984</span> afin qu'il formate en <span class="numbers">2,984</span> sans les décimales. J'ai essayé $('span.numbers').format({format : "#,###", locale : "us"}) ; mais rien ne s'est passé. Je suis toujours en train d'examiner le plugin et de jouer avec. Désolé, je suis un novice en matière de jQuery :-)

0 votes

+1 Super de connaître ce plugin. Je suis d'accord que pour la croissance et l'internationalisation future, ce serait la meilleure voie à suivre.

0 votes

Voici le lien vers son repo GitHub. github.com/hardhub/jquery-numberformatter

24voto

Ray Points 12711

Ce n'est pas jQuery, mais cela fonctionne pour moi. Tiré de ce site .

function addCommas(nStr) {
    nStr += '';
    x = nStr.split('.');
    x1 = x[0];
    x2 = x.length > 1 ? '.' + x[1] : '';
    var rgx = /(\d+)(\d{3})/;
    while (rgx.test(x1)) {
        x1 = x1.replace(rgx, '$1' + ',' + '$2');
    }
    return x1 + x2;
}

1 votes

Très "roots" de votre part :)

0 votes

"Je ne pense pas que les autres approches fantaisistes auraient fonctionné dans ma situation, où les données sont intégrées dans un Canvas (Chart.JS). Mais l'ajout de cette fonction et son appel dans l'événement afterDraw() du graphique fonctionnent parfaitement : ctx.fillText(addCommas(dataset.data[i]),

0 votes

Cela ne fonctionne pas par exemple pour 3000000 (7 chiffres). Seulement pour 6 chiffres et moins !

17voto

Nathan Long Points 30303

Une solution plus approfondie

L'élément central est le replace appel. Jusqu'à présent, je pense qu'aucune des solutions proposées ne traite tous les cas suivants :

  • Les nombres entiers : 1000 => '1,000'
  • Cordes : '1000' => '1,000'
  • Pour les cordes :
    • Préserve les zéros après la décimale : 10000.00 => '10,000.00'
    • Ignore les zéros de tête avant la décimale : '01000.00 => '1,000.00'
    • N'ajoute pas de virgule après la décimale : '1000.00000' => '1,000.00000'
    • Préserve le leadership - o + : '-1000.0000' => '-1,000.000'
    • Retourne, sans les modifier, les chaînes de caractères contenant des non-digits : '1000k' => '1000k'

La fonction suivante fait tout ce qui précède.

addCommas = function(input){
  // If the regex doesn't match, `replace` returns the string unmodified
  return (input.toString()).replace(
    // Each parentheses group (or 'capture') in this regex becomes an argument 
    // to the function; in this case, every argument after 'match'
    /^([-+]?)(0?)(\d+)(.?)(\d+)$/g, function(match, sign, zeros, before, decimal, after) {

      // Less obtrusive than adding 'reverse' method on all strings
      var reverseString = function(string) { return string.split('').reverse().join(''); };

      // Insert commas every three characters from the right
      var insertCommas  = function(string) { 

        // Reverse, because it's easier to do things from the left
        var reversed           = reverseString(string);

        // Add commas every three characters
        var reversedWithCommas = reversed.match(/.{1,3}/g).join(',');

        // Reverse again (back to normal)
        return reverseString(reversedWithCommas);
      };

      // If there was no decimal, the last capture grabs the final digit, so
      // we have to put it back together with the 'before' substring
      return sign + (decimal ? insertCommas(before) + decimal + after : insertCommas(before + after));
    }
  );
};

Vous pourriez l'utiliser dans un plugin jQuery comme celui-ci :

$.fn.addCommas = function() {
  $(this).each(function(){
    $(this).text(addCommas($(this).text()));
  });
};

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