120 votes

Séparateur de milliers en Javascript / format de chaîne de caractères

Existe-t-il une fonction en Javascript pour formater les nombres et les chaînes de caractères ?

Je cherche un moyen de faire un séparateur de milliers de caractères ou de nombres... (Comme String.Format en c#)

221voto

Tim Goodman Points 7792

Mise à jour (7 ans plus tard)

La référence citée dans la réponse originale ci-dessous était erronée. Il y a es une fonction intégrée pour cela, ce qui est exactement ce que fait le kaiser suggère ci-dessous : toLocaleString

Vous pouvez donc le faire :

(1234567.89).toLocaleString('en')              // for numeric input
parseFloat("1234567.89").toLocaleString('en')  // for string input

La fonction mise en œuvre ci-dessous fonctionne également, mais n'est tout simplement pas nécessaire.

(J'ai pensé que j'aurais peut-être de la chance et que je découvrirais qu'il fue nécessaire en 2010, mais non. D'après cette une référence plus fiable En effet, toLocaleString fait partie de la norme depuis la 3e édition d'ECMAScript [1999], ce qui signifie, je crois, qu'il aurait été pris en charge dès IE 5.5).


Réponse originale

Selon le cette référence il n'y a pas de fonction intégrée pour ajouter des virgules à un nombre. Mais cette page contient un exemple de la manière de la coder soi-même :

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

Edita: Pour aller dans l'autre sens (convertir une chaîne avec des virgules en nombre), vous pourriez faire quelque chose comme ceci :

parseFloat("1,234,567.89".replace(/,/g,''))

45voto

Emissary Points 3550

Mise à jour de la prise en charge du look-behind en accord avec les changements d'ECMAScript2018.
Pour une compatibilité ascendante, défilez plus bas pour voir la solution originale.

Une expression régulière peut être utilisée - particulièrement utile pour traiter les grands nombres stockés sous forme de chaînes de caractères.

const format = num => 
    String(num).replace(/(?<!\..*)(\d)(?=(?:\d{3})+(?:\.|$))/g, '$1,')

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

" Explication de regex verbeuses (regex101.com) flow diagram


Cette réponse originale n'est peut-être pas nécessaire, mais elle peut être utilisée à des fins de rétrocompatibilité.

En essayant de gérer cela avec une seule expression régulière (sans rappel) ma capacité actuelle me fait défaut faute d'un look-behind négatif en Javascript... néanmoins voici une autre alternative concise qui fonctionne dans la plupart des cas généraux - tenir compte de tout point décimal en ignorant les correspondances où l'index de la correspondance apparaît après l'index d'un point.

const format = num => {
    const n = String(num),
          p = n.indexOf('.')
    return n.replace(
        /\d(?=(?:\d{3})+(?:\.|$))/g,
        (m, i) => p < 0 || i < p ? `${m},` : m
    )
}

;[
    format(100),                           // "100"
    format(1000),                          // "1,000"
    format(1e10),                          // "10,000,000,000"  
    format(1000.001001),                   // "1,000.001001"
    format('100000000000000.001001001001') // "100,000,000,000,000.001001001001
]
    .forEach(n => console.log(n))

" Explication de regex verbeuses (regex101.com)

flow diagram

11voto

qdev Points 149

Il existe un plugin jQuery pour les nombres : https://github.com/teamdf/jquery-number

Il vous permet de modifier n'importe quel nombre dans le format que vous souhaitez, avec des options pour les chiffres décimaux et les caractères de séparation pour les décimales et les milliers :

$.number(12345.4556, 2);          // -> 12,345.46
$.number(12345.4556, 3, ',', ' ') // -> 12 345,456

Vous pouvez l'utiliser directement dans les champs de saisie, ce qui est plus agréable, en utilisant les mêmes options que ci-dessus :

$("input").number(true, 2);

Vous pouvez également l'appliquer à un ensemble d'éléments du DOM à l'aide d'un sélecteur :

$('span.number').number(true, 2);

6voto

vikashraj144 Points 1
var number = 35002343;

console.log(number.toLocaleString());

Pour la référence, vous pouvez consulter le site suivant https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString

6voto

Abhishek Goel Points 792

J'utilise ceci :

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

source : enlace

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