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.
Faites un remplacement en premier:
parseFloat(str.replace(',','.').replace(' ',''))
La solution parfaite
accounting.js
est une petite bibliothèque JavaScript pour le formatage des nombres, de l’argent et des devises.
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.
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.
Qu'en est-il de:
parseFloat(str.replace(' ', '').replace('.', '').replace(',', '.'));
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.