web-dev-qa-db-fra.com

Convertir une chaîne avec un point ou une virgule comme séparateur décimal en chiffre en JavaScript

Un élément d’entrée contient des nombres où une virgule ou un point est utilisé comme séparateur décimal et l’espace peut être utilisé pour regrouper des milliers comme ceci:

'1,2'
'110 000,23'
'100 1,23'

Comment pourrait-on les convertir en un nombre flottant dans le navigateur en utilisant JavaScript?

jQuery et jQuery UI sont utilisés. Number(string) retourne NaN et parseFloat() s'arrête au premier espace ou virgule.

42
Andrus

Faites un remplacement en premier:

parseFloat(str.replace(',','.').replace(' ',''))
44
hytest

La solution parfaite

accounting.js est une petite bibliothèque JavaScript pour le formatage des nombres, de l’argent et des devises.

Cochez cette référence

19
Shafiq

Je me rends compte que je suis en retard à la fête, mais je voulais une solution qui gèrerait correctement le regroupement des chiffres ainsi que différents séparateurs décimaux pour les monnaies. Comme aucun de ceux-ci ne couvrait pleinement mon cas d'utilisation, j'ai écrit ma propre solution qui pourrait être utile aux autres:

function parsePotentiallyGroupedFloat(stringValue) {
    stringValue = stringValue.trim();
    var result = stringValue.replace(/[^0-9]/g, '');
    if (/[,\.]\d{2}$/.test(stringValue)) {
        result = result.replace(/(\d{2})$/, '.$1');
    }
    return parseFloat(result);
}

Cela devrait éliminer les non-chiffres, puis vérifier s'il y avait un point décimal (ou une virgule) suivi de deux chiffres et insérer le point décimal si nécessaire.

Il est à noter que je visais spécifiquement cette devise et que, en tant que tel, cela suppose soit pas de décimale, soit exactement deux. Il est assez difficile de savoir avec certitude si le premier point décimal potentiel rencontré est un point décimal ou un caractère de regroupement de chiffres (par exemple, 1.542 pourrait être 1542) sauf si vous connaissez les paramètres régionaux actuels, mais il devrait être assez facile de les adapter à votre cas d'utilisation spécifique en modifiant \d{2}$ vers quelque chose qui correspondra à ce que vous vous attendez après le point décimal.

16
Thor84no

Vous pouvez remplacer tous les espaces par une chaîne vide, toutes les virgules par des points, puis l’analyser.

var str = "110 000,23";
var num = parseFloat(str.replace(/\s/g, "").replace(",", "."));
console.log(num);

J'ai utilisé une expression régulière dans le premier pour pouvoir faire correspondre tous les espaces, pas seulement le premier.

9
Alex Turpin

C'est la meilleure solution

http://numeraljs.com/

numeral().unformat('0.02'); = 0.02
7
stuartchaney

Qu'en est-il de:

parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.'));
6
lpinto.eu

Toutes les autres solutions nécessitent que vous connaissiez le format à l'avance. J'avais besoin de détecter (!) Le format dans tous les cas et c'est ce que je me retrouve avec.

function detectFloat(source) {
    let float = accounting.unformat(source);
    let posComma = source.indexOf(',');
    if (posComma > -1) {
        let posDot = source.indexOf('.');
        if (posDot > -1 && posComma > posDot) {
            let germanFloat = accounting.unformat(source, ',');
            if (Math.abs(germanFloat) > Math.abs(float)) {
                float = germanFloat;
            }
        } else {
            // source = source.replace(/,/g, '.');
            float = accounting.unformat(source, ',');
        }
    }
    return float;
}

Ceci a été testé avec les cas suivants:

        const cases = {
            "0": 0,
            "10.12": 10.12,
            "222.20": 222.20,
            "-222.20": -222.20,
            "+222,20": 222.20,
            "-222,20": -222.20,
            "-2.222,20": -2222.20,
            "-11.111,20": -11111.20,
        };

Suggestions bienvenues.

4
Slawa