Comment imprimer un nombre avec des virgules comme des milliers de séparateurs en JavaScript

j'essaie d'imprimer un entier dans JavaScript avec des virgules comme des milliers de séparateurs. Par exemple, je veux montrer le nombre 1234567 comme "1.234567". Comment pourrais-je aller sur le faire?

Voici comment je le fais:

function numberWithCommas(x) {
    x = x.toString();
    var pattern = /(-?d+)(d{3})/;
    while (pattern.test(x))
        x = x.replace(pattern, ",");
    return x;
}

y a-t-il une façon plus simple ou plus élégante de le faire? Ce serait bien si cela fonctionne avec les chars aussi, mais ce n'est pas nécessaire. Il n'est pas nécessaire qu'il soit spécifique à une localité pour décider entre les périodes et les virgules.

1224
demandé sur ᴡʜᴀᴄᴋᴀᴍᴀᴅᴏᴏᴅʟᴇ3000 2010-05-25 03:42:31

30 réponses

j'ai utilisé l'idée de la réponse de Kerry, mais l'ai simplifiée puisque je cherchais juste quelque chose de simple pour mon but spécifique. Voici ce que j'ai fait:

const numberWithCommas = (x) => {
  return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

c'est tout Ce que vous devez vraiment savoir.

@Neils Bom a demandé comment fonctionne le regex. Mon explication est un peu longue. Elle ne rentre pas dans les commentaires et je ne sais pas où le mettre donc je le fais ici. Si quelqu'un a d'autres suggestions pour savoir où le mettre, s'il vous plaît laissez-moi savoir.

le regex utilise 2 assertions lookahead: une assertion positive pour chercher n'importe quel point dans la chaîne qui a un multiple de 3 chiffres dans une rangée après elle, et une assertion négative pour s'assurer que le point a seulement exactement un multiple de 3 chiffres. L'expression de remplacement met une virgule là.

par exemple, si vous le Passez "123456789.01", l'affirmation positive correspondra à chaque endroit à la gauche du 7 (puisque "789" est un multiple de 3 chiffres, "678" est un multiple de 3 chiffres, "567", etc.). L'assertion négative vérifie que le multiple de 3 chiffres n'a pas de chiffres après lui. "789" a une période après lui donc il est exactement un multiple de 3 chiffres, donc une virgule va là. "678 "est un multiple de 3 chiffres mais il a un" 9 " après lui, donc ces 3 chiffres font partie d'un groupe de 4, et une virgule ne va pas là. De même pour "567". "456789" est 6 chiffres, ce qui est un multiple de 3, donc une virgule va avant ça. "345678" est un multiple de 3, mais il a un "9" après ça, donc aucune virgule n'y va. Et ainsi de suite. Le "\b " empêche le regex de placer une virgule au début de la chaîne.

@neu-rah a mentionné que cette fonction ajoute des virgules dans les endroits indésirables s'il ya plus de 3 chiffres après le point décimal. Si c'est un problème, vous pouvez utiliser cette fonction:

const numberWithCommas = (x) => {
  var parts = x.toString().split(".");
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  return parts.join(".");
}
2117
répondu Elias Zamaria 2017-11-21 22:16:57

je suis surpris que personne n'ait mentionné le numéro .prototype.toLocaleString . Il est mis en œuvre dans JavaScript 1.5 (qui a été introduit en 1999) donc il est essentiellement pris en charge par les principaux navigateurs.

var n = 34523453.345
n.toLocaleString()
"34,523,453.345"

il fonctionne aussi dans le noeud.js à partir de v0.12 via l'inclusion de Intl

si vous voulez quelque chose de différent, Numeral.js pourrait être intéressant.

1106
répondu uKolka 2015-11-06 16:30:32
var number = 1234567890; // Example number to be converted

, car javascript a une valeur de entier maximum de 9007199254740991 151980920"


toLocaleString :

number.toLocaleString(); // "1,234,567,890"

// A more complex example: 
var number2 = 1234.56789; // floating point example
number2.toLocaleString(undefined, {maximumFractionDigits:2}) // "1,234.57"



numéro D'ordre ( Safari non supporté):

var nf = new Intl.NumberFormat();
nf.format(number); // "1,234,567,890"

D'après ce que j'ai vérifié (au moins Firefox), ils sont plus ou moins les mêmes en ce qui concerne les performances.

183
répondu vsync 2017-05-19 17:38:48

je suggère d'utiliser phpjs.org "s number_format ()

function number_format(number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // +      input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +   improved by: davook
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Jay Klehr
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Amir Habibi (http://www.residence-mixte.com/)
    // +     bugfix by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Theriault
    // +   improved by: Drew Noakes
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    // *    example 10: number_format('1.20', 2);
    // *    returns 10: '1.20'
    // *    example 11: number_format('1.20', 4);
    // *    returns 11: '1.2000'
    // *    example 12: number_format('1.2000', 3);
    // *    returns 12: '1.200'
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        toFixedFix = function (n, prec) {
            // Fix for IE parseFloat(0.55).toFixed(0) = 0;
            var k = Math.pow(10, prec);
            return Math.round(n * k) / k;
        },
        s = (prec ? toFixedFix(n, prec) : Math.round(n)).toString().split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

mise à jour 13/02/14

les gens ont rapporté que cela ne fonctionne pas comme prévu, donc j'ai fait un js Fiddle qui inclut des tests automatisés.

mise à jour 26/11/2017

voici ce violon comme un morceau de pile avec une sortie légèrement modifiée:

function number_format(number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // +      input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +   improved by: davook
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Jay Klehr
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Amir Habibi (http://www.residence-mixte.com/)
    // +     bugfix by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Theriault
    // +   improved by: Drew Noakes
    // *     example 1: number_format(1234.56);
    // *     returns 1: '1,235'
    // *     example 2: number_format(1234.56, 2, ',', ' ');
    // *     returns 2: '1 234,56'
    // *     example 3: number_format(1234.5678, 2, '.', '');
    // *     returns 3: '1234.57'
    // *     example 4: number_format(67, 2, ',', '.');
    // *     returns 4: '67,00'
    // *     example 5: number_format(1000);
    // *     returns 5: '1,000'
    // *     example 6: number_format(67.311, 2);
    // *     returns 6: '67.31'
    // *     example 7: number_format(1000.55, 1);
    // *     returns 7: '1,000.6'
    // *     example 8: number_format(67000, 5, ',', '.');
    // *     returns 8: '67.000,00000'
    // *     example 9: number_format(0.9, 0);
    // *     returns 9: '1'
    // *    example 10: number_format('1.20', 2);
    // *    returns 10: '1.20'
    // *    example 11: number_format('1.20', 4);
    // *    returns 11: '1.2000'
    // *    example 12: number_format('1.2000', 3);
    // *    returns 12: '1.200'
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        toFixedFix = function (n, prec) {
            // Fix for IE parseFloat(0.55).toFixed(0) = 0;
            var k = Math.pow(10, prec);
            return Math.round(n * k) / k;
        },
        s = (prec ? toFixedFix(n, prec) : Math.round(n)).toString().split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

var exampleNumber = 1;
function test(expected, number, decimals, dec_point, thousands_sep)
{
    var actual = number_format(number, decimals, dec_point, thousands_sep);
    console.log(
        'Test case ' + exampleNumber + ': ' +
        '(decimals: ' + (typeof decimals === 'undefined' ? '(default)' : decimals) +
        ', dec_point: "' + (typeof dec_point === 'undefined' ? '(default)' : dec_point) + '"' +
        ', thousands_sep: "' + (typeof thousands_sep === 'undefined' ? '(default)' : thousands_sep) + '")'
    );
    console.log('  => ' + (actual === expected ? 'Passed' : 'FAILED') + ', got "' + actual + '", expected "' + expected + '".');
    exampleNumber++;
}

test('1,235',    1234.56);
test('1 234,56', 1234.56, 2, ',', ' ');
test('1234.57',  1234.5678, 2, '.', '');
test('67,00',    67, 2, ',', '.');
test('1,000',    1000);
test('67.31',    67.311, 2);
test('1,000.6',  1000.55, 1);
test('67.000,00000', 67000, 5, ',', '.');
test('1',        0.9, 0);
test('1.20',     '1.20', 2);
test('1.2000',   '1.20', 4);
test('1.200',    '1.2000', 3);
.as-console-wrapper {
  max-height: 100% !important;
}
89
répondu Kerry Jones 2017-11-26 13:13:48

c'est une variation de la réponse de @mikez302, mais modifié pour supporter 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 "

function numberWithCommas(n) {
    var parts=n.toString().split(".");
    return parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (parts[1] ? "." + parts[1] : "");
}
65
répondu user1437663 2012-06-05 15:03:10
function formatNumber (num) {
    return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, ",")
}

print(formatNumber(2665));      // 2,665
print(formatNumber(102665));    // 102,665
print(formatNumber(111102665)); // 111,102,665
55
répondu Tutankhamen 2014-08-19 06:47:01

Merci à tous pour leurs réponses. J'ai construit à partir de certaines des réponses pour faire une solution plus "One-size-fits-all".

le premier fragment ajoute une fonction qui imite PHP 's number_format() au nombre prototype. Si je formate un nombre, Je veux habituellement des places décimales de sorte que la fonction prend dans le nombre de places décimales à montrer. Certains pays utilisent les virgules comme décimales et les décimales comme séparateurs de milliers de sorte que le fonction permet de régler ces séparateurs.

Number.prototype.numberFormat = function(decimals, dec_point, thousands_sep) {
    dec_point = typeof dec_point !== 'undefined' ? dec_point : '.';
    thousands_sep = typeof thousands_sep !== 'undefined' ? thousands_sep : ',';

    var parts = this.toFixed(decimals).split('.');
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousands_sep);

    return parts.join(dec_point);
}

vous utiliseriez ceci comme suit:

var foo = 5000;
console.log(foo.numberFormat(2)); // us format: 5,000.00
console.log(foo.numberFormat(2, ',', '.')); // european format: 5.000,00

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 à 5, en prenant simplement la première séquence de valeurs entières. J'ai donc créé ma propre fonction de conversion float et je l'ai ajoutée au prototype de chaîne.

String.prototype.getFloat = function(dec_point, thousands_sep) {
    dec_point = typeof dec_point !== 'undefined' ? dec_point : '.';
    thousands_sep = typeof thousands_sep !== 'undefined' ? thousands_sep : ',';

    var parts = this.split(dec_point);
    var re = new RegExp("[" + thousands_sep + "]");
    parts[0] = parts[0].replace(re, '');

    return parseFloat(parts.join(dec_point));
}

Maintenant, vous pouvez utiliser les deux fonctions comme suit:

var foo = 5000;
var fooString = foo.numberFormat(2); // The string 5,000.00
var fooFloat = fooString.getFloat(); // The number 5000;

console.log((fooString.getFloat() + 1).numberFormat(2)); // The string 5,001.00
31
répondu J.Money 2014-07-08 21:51:29

Intl.Numéro d'ordre

Native js function. Pris en charge par IE11, Edge, dernière Safari, Chrome, Firefox, Opera, Safari sur iOS et Chrome sur Android.

var number = 3500;

console.log(new Intl.NumberFormat().format(number));
// → '3,500' if in US English locale
29
répondu lonelyloner 2017-11-14 16:21:23

utilisant L'expression régulière

function toCommas(value) {
    return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
console.log(toCommas(123456789)); // 123,456,789
console.log(toCommas(1234567890)); // 1,234,567,890
console.log(toCommas(1234)); // 1,234

utilisant toLocaleString ()

var number = 123456.789;

// request a currency format
console.log(number.toLocaleString('de-DE', { style: 'currency', currency: 'EUR' }));
// → 123.456,79 €

// the Japanese yen doesn't use a minor unit
console.log(number.toLocaleString('ja-JP', { style: 'currency', currency: 'JPY' }))
// → ¥123,457

// limit to three significant digits
console.log(number.toLocaleString('en-IN', { maximumSignificantDigits: 3 }));
// → 1,23,000

ref MDN: Number.prototype.toLocaleString ()

Utilisant Intl.NumberFormat ()

var number = 123456.789;

console.log(new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(number));
// expected output: "123.456,79 €"

// the Japanese yen doesn't use a minor unit
console.log(new Intl.NumberFormat('ja-JP', { style: 'currency', currency: 'JPY' }).format(number));
// expected output: "¥123,457"

// limit to three significant digits
console.log(new Intl.NumberFormat('en-IN', { maximumSignificantDigits: 3 }).format(number));
// expected output: "1,23,000"

ref Intl.Numéro d'ordre "1519140920

DÉMO ICI

<script type="text/javascript">
  // Using Regular expression
  function toCommas(value) {
    return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  }

  function commas() {
    var num1 = document.myform.number1.value;

    // Using Regular expression
    document.getElementById('result1').value = toCommas(parseInt(num1));
    // Using toLocaleString()
    document.getElementById('result2').value = parseInt(num1).toLocaleString('ja-JP', {
      style: 'currency',
      currency: 'JPY'
    });
    // Using Intl.NumberFormat()
    document.getElementById('result3').value = new Intl.NumberFormat('ja-JP', {
      style: 'currency',
      currency: 'JPY'
    }).format(num1);
  }
</script>
<FORM NAME="myform">
  <INPUT TYPE="text" NAME="number1" VALUE="123456789">
  <br>
  <INPUT TYPE="button" NAME="button" Value="=>" onClick="commas()">
  <br>Using Regular expression
  <br>
  <INPUT TYPE="text" ID="result1" NAME="result1" VALUE="">
  <br>Using toLocaleString()
  <br>
  <INPUT TYPE="text" ID="result2" NAME="result2" VALUE="">
  <br>Using Intl.NumberFormat()
  <br>
  <INPUT TYPE="text" ID="result3" NAME="result3" VALUE="">

</FORM>
28
répondu TinhNQ 2018-08-17 01:30:52

je pense que c'est l'expression régulière la plus courte qui le fait:

/\B(?=(\d{3})+\b)/g

"123456".replace(/\B(?=(\d{3})+\b)/g, ",")

j'ai vérifié quelques chiffres et ça a marché.

22
répondu user3664916 2015-03-13 07:50:38

Number.prototype.toLocaleString() aurait été génial s'il avait été fourni nativement par tous les navigateurs (Safari) .

j'ai vérifié toutes les autres réponses mais personne n'a semblé la remplir. Voici un poc dans cette direction, qui est en fait une combinaison des deux premières réponses; si toLocaleString fonctionne, il l'utilise, si ce n'est pas elle utilise une fonction personnalisée.

var putThousandsSeparators;

putThousandsSeparators = function(value, sep) {
  if (sep == null) {
    sep = ',';
  }
  // check if it needs formatting
  if (value.toString() === value.toLocaleString()) {
    // split decimals
    var parts = value.toString().split('.')
    // format whole numbers
    parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, sep);
    // put them back together
    value = parts[1] ? parts.join('.') : parts[0];
  } else {
    value = value.toLocaleString();
  }
  return value;
};

alert(putThousandsSeparators(1234567.890));
18
répondu Sinan 2017-03-03 05:46:26

le séparateur de milliers peut être inséré d'une manière conviviale à l'échelle internationale en utilisant le navigateur Intl objet:

Intl.NumberFormat().format(1234);
// returns "1,234" if the user's locale is en_US, for example

voir article de MDN sur NumberFormat pour plus, vous pouvez spécifier le comportement local ou par défaut à l'utilisateur. Ceci est un peu plus infaillible parce qu'il respecte les différences locales; de nombreux pays utilisent des périodes 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 la dernière Chrome, Opera, & IE. La prochaine version de Firefox devrait le supporter. Webkit ne semble pas avoir de calendrier de mise en œuvre.

15
répondu phette23 2014-04-26 01:43:16

si vous avez affaire à des valeurs de devises et de formatage beaucoup, alors il pourrait être utile d'ajouter minuscule comptabilité.js qui gère le lot de cas de bord et de localisation:

// Default usage:
accounting.formatMoney(12345678); // ,345,678.00

// European formatting (custom symbol and separators), could also use options object as second param:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99

// Negative values are formatted nicely, too:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000

// Simple `format` string allows control of symbol position [%v = value, %s = symbol]:
accounting.formatMoney(5318008, { symbol: "GBP",  format: "%v %s" }); // 5,318,008.00 GBP
13
répondu ShitalShah 2014-01-25 17:40:57

le code suivant utilise char scan, donc il n'y a pas de regex.

function commafy( num){
  var parts = (''+(num<0?-num:num)).split("."), s=parts[0], L, i=L= s.length, o='';
  while(i--){ o = (i===0?'':((L-i)%3?'':',')) 
                  +s.charAt(i) +o }
  return (num<0?'-':'') + o + (parts[1] ? '.' + parts[1] : ''); 
}

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 le num<0. Voir https://jsfiddle.net/runsun/p5tqqvs3 /

12
répondu runsun 2015-09-24 21:31:31

vous pouvez utiliser cette procédure pour formater votre besoin de monnaie.

var nf = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
  minimumFractionDigits: 2,
  maximumFractionDigits: 2
});
nf.format(123456.789); // ‘3,456.79’

pour plus d'informations, vous pouvez accéder à ce lien.

https://www.justinmccandless.com/post/formatting-currency-in-javascript /

12
répondu Dulith De Cozta 2018-03-07 21:46:41

Voici une fonction simple qui insère des virgules pour mille séparateurs. Il utilise des fonctions array plutôt qu'un RegEx.

/**
 * Format a number as a string with commas separating the thousands.
 * @param num - The number to be formatted (e.g. 10000)
 * @return A string representing the formatted number (e.g. "10,000")
 */
var formatNumber = function(num) {
    var array = num.toString().split('');
    var index = -3;
    while (array.length + index > 0) {
        array.splice(index, 0, ',');
        // Decrement by 4 since we just added another unit to the array.
        index -= 4;
    }
    return array.join('');
};
9
répondu Noah Freitas 2012-05-02 16:51:39

j'ai Écrit celui-ci avant de trébucher sur ce post. Pas de regex et vous pouvez réellement comprendre le code.

$(function(){
  
  function insertCommas(s) {

    // get stuff before the dot
    var d = s.indexOf('.');
    var s2 = d === -1 ? s : s.slice(0, d);

    // insert commas every 3 digits from the right
    for (var i = s2.length - 3; i > 0; i -= 3)
      s2 = s2.slice(0, i) + ',' + s2.slice(i);

    // append fractional part
    if (d !== -1)
      s2 += s.slice(d);

    return s2;

  }
  
  
  $('#theDudeAbides').text( insertCommas('1234567.89012' ) );
  
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="theDudeAbides"></div>
8
répondu Ronnie Overby 2014-11-25 21:41:06

je vais essayer de m'améliorer uKolka 's réponse et peut-être aider d'autres personnes à épargner un peu de temps.

Utiliser Chiffre.js .

document.body.textContent = numeral(1234567).format('0,0');
<script src="//cdnjs.cloudflare.com/ajax/libs/numeral.js/1.4.5/numeral.min.js"></script>

tu devrais choisir .prototype.toLocaleString() si et seulement si son navigateur de compatibilité n'est pas un problème.

6
répondu Beder Acosta Borges 2017-05-23 12:02:48

pour moi, la meilleure réponse est d'utiliser toLocaleString comme certains membres l'ont dit. Si vous voulez inclure le symbole '$' il suffit d'ajouter languaje et les options de type. Voici un exemple pour formater un nombre en Pesos mexicains

var n = 1234567.22
alert(n.toLocaleString("es-MX",{style:"currency", currency:"MXN"}))

raccourci

1234567.22.toLocaleString("es-MX",{style:"currency", currency:"MXN"})
5
répondu Carlos A. Ortiz 2016-02-18 18:45:33

je pense que cette fonction va s'occuper de toutes les questions liées à ce problème.

function commaFormat(inputString) {
    inputString = inputString.toString();
    var decimalPart = "";
    if (inputString.indexOf('.') != -1) {
        //alert("decimal number");
        inputString = inputString.split(".");
        decimalPart = "." + inputString[1];
        inputString = inputString[0];
        //alert(inputString);
        //alert(decimalPart);

    }
    var outputString = "";
    var count = 0;
    for (var i = inputString.length - 1; i >= 0 && inputString.charAt(i) != '-'; i--) {
        //alert("inside for" + inputString.charAt(i) + "and count=" + count + " and outputString=" + outputString);
        if (count == 3) {
            outputString += ",";
            count = 0;
        }
        outputString += inputString.charAt(i);
        count++;
    }
    if (inputString.charAt(0) == '-') {
        outputString += "-";
    }
    //alert(outputString);
    //alert(outputString.split("").reverse().join(""));
    return outputString.split("").reverse().join("") + decimalPart;
}
4
répondu AbhinavRanjan 2014-09-16 22:00:47
var formatNumber = function (number) {
  var splitNum;
  number = Math.abs(number);
  number = number.toFixed(2);
  splitNum = number.split('.');
  splitNum[0] = splitNum[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  return splitNum.join(".");
}
3
répondu Kiry Meas 2017-06-10 18:38:49

j'ai ajouté à la solution de Aki143S . Cette solution utilise des points pour des milliers de séparateurs et virgule pour la précision.

function formatNumber( num, fixed ) { 
    var decimalPart;

    var array = Math.floor(num).toString().split('');
    var index = -3; 
    while ( array.length + index > 0 ) { 
        array.splice( index, 0, '.' );              
        index -= 4;
    }

    if(fixed > 0){
        decimalPart = num.toFixed(fixed).split(".")[1];
        return array.join('') + "," + decimalPart; 
    }
    return array.join(''); 
};

Exemples;

formatNumber(17347, 0)  = 17.347
formatNumber(17347, 3)  = 17.347,000
formatNumber(1234563.4545, 3)  = 1.234.563,454
2
répondu bartburkhardt 2012-11-08 12:47:33

je pense que votre solution est l'une des plus courtes que j'ai vu pour cela. Je ne pense pas qu'il y ait de fonctions JavaScript standard pour faire ce genre de chose, donc vous êtes probablement tout seul.

j'ai vérifié les spécifications CSS 3 pour voir s'il est possible de faire cela dans CSS, mais à moins que vous ne vouliez chaque chiffre dans son propre <span> , Je ne pense pas que ce soit possible.

j'ai trouvé un projet sur code Google que avait l'air prometteur: flexible-js-mise en forme . Je ne l'ai pas utilisé, mais il semble assez flexible et a des tests unitaires en utilisant JsUnit . Le développeur a également beaucoup de messages (bien que vieux) sur ce sujet.

n'oubliez pas de tenir compte des utilisateurs internationaux: de nombreux pays utilisent un espace comme séparateur et utilisent la virgule pour séparer la décimale de la partie intégrante du nombre.

2
répondu jasonmp85 2013-06-08 13:58:11

Beaucoup de bonnes réponses déjà. En voici un autre, juste pour le plaisir:

function format(num, fix) {
    var p = num.toFixed(fix).split(".");
    return p[0].split("").reduceRight(function(acc, num, i, orig) {
        if ("-" === num && 0 === i) {
            return num + acc;
        }
        var pos = orig.length - i - 1
        return  num + (pos && !(pos % 3) ? "," : "") + acc;
    }, "") + (p[1] ? "." + p[1] : "");
}

quelques exemples:

format(77.03453, 2); // "77.03"
format(78436589374); // "78,436,589,374"
format(784, 4);      // "784.0000"
format(-123456);     // "-123,456"
2
répondu Wayne Burkett 2014-03-13 17:38:15

Voici mon essai:

modifier: ajouté en décimales

function splitMille(n, separator = ',') {
  // Cast to string
  let num = (n + '')

  // Test for and get any decimals (the later operations won't support them)
  let decimals = ''
  if (/\./.test(num)) {
    // This regex grabs the decimal point as well as the decimal numbers
    decimals = num.replace(/^.*(\..*)$/, '')
  }
  
  // Remove decimals from the number string
  num = num.replace(decimals, '')
    // Reverse the number string through Array functions
    .split('').reverse().join('')
    // Split into groups of 1-3 characters (with optional supported character "-" for negative numbers)
    .match(/[0-9]{1,3}-?/g)
    // Add in the mille separator character and reverse back
    .join(separator).split('').reverse().join('')

  // Put the decimals back and output the formatted number
  return `${num}${decimals}`
}

let testA = splitMille(1234)
let testB = splitMille(-1234)
let testC = splitMille(123456.789)
let testD = splitMille(9007199254740991)
let testE = splitMille(1000.0001)

console.log('Results!\n\tA: %s\n\tB: %s\n\tC: %s\n\tD: %s\n\tE: %s', testA, testB, testC, testD, testE)
2
répondu Matt Scheurich 2017-06-28 15:49:56

après n'avoir pas trouvé de solution moderne et complète ici, j'ai écrit une fonction flèche (sans regex) pour résoudre le problème de formatage et il permet à l'appelant de fournir le nombre de fraction chiffres ainsi que le période Et mille séparateur pour l'Europe et le reste du monde.

exemples:

numberFormatter(1234567890.123456) => 1,234,567,890
numberFormatter(1234567890.123456, 4) => 1,234,567,890.1235
numberFormatter(1234567890.123456, 4, '.', ',') => 1.234.567.890,1235 Europe

Voici la fonction écrite en ES6 (syntaxe moderne):

const numberFormatter = (number, fractionDigits = 0, thousandSeperator = ',', fractionSeperator = '.') => {
    if (number!==0 && !number || !Number.isFinite(number)) return number
    const frDigits = Number.isFinite(fractionDigits)? Math.min(Math.max(fractionDigits, 0), 7) : 0
    const num = number.toFixed(frDigits).toString()

    const parts = num.split('.')
    let digits = parts[0].split('').reverse()
    let sign = ''
    if (num < 0) {sign = digits.pop()}
    let final = []
    let pos = 0

    while (digits.length > 1) {
        final.push(digits.shift())
        pos++
        if (pos % 3 === 0) {final.push(thousandSeperator)}
    }
    final.push(digits.shift())
    return `${sign}${final.reverse().join('')}${frDigits > 0 ? fractionSeperator : ''}${frDigits > 0 && parts[1] ? parts[1] : ''}`
}

Il a été testé pour la négative, mauvaise entrée et NaN cas . Si l'entrée est NaN alors il retourne simplement.

2
répondu Hannes Sverrisson 2018-05-14 18:47:04

la solution de @user1437663 est grande.

qui comprend vraiment la solution se prépare à comprendre des expressions régulières complexes.

Une petite amélioration pour le rendre plus lisible:

function numberWithCommas(x) {
    var parts = x.toString().split(".");
    return parts[0].replace(/\B(?=(\d{3})+(?=$))/g, ",") + (parts[1] ? "." + parts[1] : "");
}

le motif commence par \b pour éviter d'utiliser la virgule au début d'un mot. Fait intéressant, le modèle est retourné vide parce que \b n'avance pas le "curseur" (la même chose s'applique à $ ).

O \B est suivi par des ressources moins connues mais est une caractéristique puissante des expressions régulières de Perl.

            Pattern1 (? = (Pattern2) ).

la magie est que ce qui est entre parenthèses ( Pattern2 ) est un modèle qui suit le modèle précédent ( Pattern1 ) mais sans avancer le curseur et ne fait pas non plus partie de la modèle retourné. C'est une sorte de futur modèle. C'est similaire quand quelqu'un regarde vers l'avant mais ne marche pas vraiment!

Dans ce cas pattern2 est

\d{3})+(?=$)

signifie 3 chiffres (une ou plusieurs fois) suivis de la fin de la chaîne ($)

enfin, remplacer la méthode change toutes les occurrences du motif trouvé (chaîne vide) pour virgule. Cela se produit uniquement dans les cas où la pièce restante est un multiple de 3 chiffres (les cas où le futur curseur atteint la fin de l'origine).

1
répondu Paulo Buchsbaum 2013-01-12 20:17:03

Voici une bonne solution avec moins de codage...

var y = "";
var arr = x.toString().split("");
for(var i=0; i<arr.length; i++)
{
    y += arr[i];
    if((arr.length-i-1)%3==0 && i<arr.length-1) y += ",";
}
1
répondu Mosiur 2014-03-14 07:36:45

une voie alternative, supportant des décimales, des séparateurs différents et des négatifs.

var number_format = function(number, decimal_pos, decimal_sep, thousand_sep) {
    var ts      = ( thousand_sep == null ? ',' : thousand_sep )
        , ds    = ( decimal_sep  == null ? '.' : decimal_sep )
        , dp    = ( decimal_pos  == null ? 2   : decimal_pos )

        , n     = Math.abs(Math.ceil(number)).toString()

        , i     = n.length % 3 
        , f     = n.substr(0, i)
    ;

    if(number < 0) f = '-' + f;

    for(;i<n.length;i+=3) {
        if(i!=0) f+=ts;
        f+=n.substr(i,3);
    }

    if(dp > 0) 
        f += ds + number.toFixed(dp).split('.')[1]

    return f;
}
1
répondu Felipe Buccioni 2014-07-14 05:50:56

j'ai adapté votre code pour travailler dans la boîte de texte (Type D'entrée=" texte") de sorte que nous pouvons entrer et supprimer des chiffres en temps réel sans perdre le curseur. Il fonctionne aussi si vous sélectionnez la gamme lorsque vous supprimez. Et vous pouvez utiliser des flèches et des boutons home/end librement.

Merci pour économiser mon temps!

//function controls number format as "1,532,162.3264321"
function numberWithCommas(x) {
    var e = e || window.event;
    if (e.keyCode >= '35' && e.keyCode <= '40') return; //skip arrow-keys
    var selStart = x.selectionStart, selEnd = x.selectionEnd; //save cursor positions
    var parts = x.value.toString().split(".");
    var part0len = parts[0].length; //old length to check if new ',' would be added. Need for correcting new cursor position (+1 to right).

    //if user deleted ',' - remove previous number instead (without selection)
    if (x.selectionLength == 0 && (e.keyCode == 8 || e.keyCode == 46)) {//if pressed 8-backspace or 46-delete button
        var delPos = parts[0].search(/\d{4}/);
        if (delPos != -1) {//if found 4 digits in a row (',' is deleted)
            if (e.keyCode == 8) {//if backspace flag
                parts[0] = parts[0].slice(0, selStart - 1) + parts[0].slice(selEnd, parts[0].length);
                selEnd--;
                if (selStart > selEnd) selStart = selEnd;
            } else {
                parts[0] = parts[0].slice(0, selStart) + parts[0].slice(selEnd + 1, parts[0].length);
                selStart++;
                if (selEnd < selStart) selEnd = selStart;
            }
        }
    }

   var hasMinus = parts[0][0] == '-';
   parts[0] = (hasMinus ? '-' : '') + parts[0].replace(/[^\d]*/g, ""); //I'd like to clear old ',' to avoid things like 1,2,3,5,634.443216
   parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ","); //sets ',' between each 3 digits
   if (part0len < parts[0].length) { //move cursor to right if added new ','
       selStart++;
       selEnd++;
   } else if (part0len > parts[0].length) { //..or if removed last one ','
       selStart--;
       selEnd--;
   }
   x.value = parts.join(".");
   x.setSelectionRange(selStart, selEnd); //restoring cursor position
}
function saveSelectionLength(x) {
    x.selectionLength = x.selectionEnd - x.selectionStart;
}

pour utiliser ce vient d'ajouter deux événements-onKeyUp et onKeyDown""

<asp:TextBox runat="server" ID="val" Width="180px" onKeyUp="numberWithCommas(this);" onKeyDown="saveSelectionLength(this);"/>
1
répondu Eluny 2015-03-23 16:29:56