149 votes

Comment analyser une chaîne de caractères avec un séparateur de milliers de virgules en un nombre ?

J'ai 2,299.00 comme une chaîne de caractères et j'essaie de l'analyser pour obtenir un nombre. J'ai essayé d'utiliser parseFloat Je suppose que la virgule est le problème, mais comment puis-je résoudre ce problème de la bonne manière ? Supprimer simplement la virgule ?

var x = parseFloat("2,299.00")
console.log(x);

5voto

Fábio Points 1089

C'est déroutant qu'ils aient inclus un toLocaleString mais pas un analyser méthode. Au moins toLocaleString sans arguments est bien supporté dans IE6+.

Pour un i18n solution, j'ai trouvé ça :

Il faut d'abord détecter le séparateur décimal de la locale de l'utilisateur :

var decimalSeparator = 1.1;
decimalSeparator = decimalSeparator.toLocaleString().substring(1, 2);

Normaliser ensuite le nombre s'il y a plus d'un séparateur décimal dans la chaîne :

var pattern = "([" + decimalSeparator + "])(?=.*\\1)";separator
var formatted = valor.replace(new RegExp(pattern, "g"), "");

Enfin, supprimez tout ce qui n'est pas un chiffre ou un séparateur décimal :

formatted = formatted.replace(new RegExp("[^0-9" + decimalSeparator + "]", "g"), '');
return Number(formatted.replace(decimalSeparator, "."));

3voto

Si vous voulez éviter le problème que David Meister a posté et que vous êtes sûr du nombre de décimales, vous pouvez remplacer tous les points et virgules et diviser par 100, ex :

var value = "2,299.00";
var amount = parseFloat(value.replace(/"|\,|\./g, ''))/100;

ou si vous avez 3 décimales

var value = "2,299.001";
var amount = parseFloat(value.replace(/"|\,|\./g, ''))/1000;

C'est à vous de décider si vous voulez utiliser parseInt, parseFloat ou Number. De plus, si vous souhaitez conserver le nombre de décimales, vous pouvez utiliser la fonction .toFixed(...).

3voto

BrunoElo Points 86
Number("2,299.00".split(',').join(''));   // 2299

La fonction split divise la chaîne en un tableau en utilisant "," comme séparateur et renvoie un tableau.
La fonction join jointe joint les éléments du tableau retourné par la fonction split.
La fonction Number() convertit la chaîne de caractères jointe en un nombre.

2voto

Iscariot Points 1124

Toutes ces réponses échouent si vous avez un nombre dans les millions.

3 456 789 renverrait simplement 3456 avec la méthode de remplacement.

La réponse la plus correcte pour supprimer simplement les virgules devrait être .

var number = '3,456,789.12';
number.split(',').join('');
/* number now equips 3456789.12 */
parseFloat(number);

Ou simplement écrit.

number = parseFloat(number.split(',').join(''));

2voto

Eldar Gerfanov Points 41

Ceci convertit un nombre dans n'importe quelle locale en nombre normal. Fonctionne aussi pour les points décimaux :

function numberFromLocaleString(stringValue, locale){
    var parts = Number(1111.11).toLocaleString(locale).replace(/\d+/g,'').split('');
    if (stringValue === null)
        return null;
    if (parts.length==1) {
        parts.unshift('');
    }   
    return Number(String(stringValue).replace(new RegExp(parts[0].replace(/\s/g,' '),'g'), '').replace(parts[1],"."));
}

//Use default browser locale
numberFromLocaleString("1,223,333.567") //1223333.567

//Use specific locale
numberFromLocaleString("1 223 333,567", "ru") //1223333.567

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