Fonction ParseFloat sensible à la culture en JavaScript?

Est-ce que quelqu'un a suggéré d'écrire la fonction ParseFloat sensible à la culture en JavaScript, de sorte que lorsque j'ai une chaîne de 100,000.22 au format de culture US, la fonction float d'analyse retourne 100000.22 alors que si j'entre 100.000,22 en culture suédoise, elle renvoie 100000.22 en flotteur?

J'ai amélioré la fonction mwilcox 'pour gérer les valeurs avec les séparateurs.

 function parseFloatOpts (str) { if(typeof str === "number"){ return str; } var ar = str.split(/\.|,/); var value = ''; for (var i in ar) { if (i>0 && i==ar.length-1) { value += "."; } value +=ar[i]; } return Number(value); } 

C'est un peu rude et prêt, mais cela peut suffire, vous permettant de passer dans les milliers et les séparateurs de décimales:

 function parseFloatOpts(num, decimal, thousands) { var bits = num.split(decimal, 2), ones = bits[0].replace(new RegExp('\\' + thousands, 'g'), ''); ones = parseFloat(ones, 10), decimal = parseFloat('0.' + bits[1], 10); return ones + decimal; } 

Exemples:

 parseFloatOpts("100.000,22", ',', '.'); //100000.22 parseFloatOpts("100,000.22", '.', ','); //100000.22 

Notez que cela ne garantit pas que le séparateur de milliers représente vraiment des milliers, etc., ou qu'il existe beaucoup d'autres sauvegardes que vous voudrez peut-être, selon l'importance de la fonction.

 var parse = function(st){ if(st.indexOf(",") === st.length-3){ st = st.replace(".", "").replace(",", "."); }else{ st = st.replace(",", ""); } return parseFloat(st, 10) } console.log(parse("100,000.22")) // 100000.22 console.log(parse("100.000,22")) // 100000.22 

Je vérifie simplement s'il y a une virgule dans la 3ème à la dernière position. Cela pourrait être affiné pour vérifier s'il y a une période dans la 4ème à la dernière position dans le cas où il n'y a pas de virgule (comme 100.000)

En regardant lonesomday's m'a donné cette pensée:

Vous pourriez également faire:

 function parse (str) var ar = str.split(/\.|,/); return Number(ar[0]+ar[1]+"."+ar[3]); 

Voici une fonction approximative. Il supposera la dernière ponctuation pour indiquer les décimales, qu'il s'agisse d'une virgule, d'une période ou de tout autre caractère que vous devrez indiquer. Il élimine ensuite d'autres ponctuations du nombre entier. Retourne ensemble et analyse comme flotteur.

 function normalizeFloat(number, chars) { var lastIndex = -1; for(i=0; i < chars.length; i++) { t = number.lastIndexOf(chars[i]); if (t > lastIndex) { lastIndex = t; } } if (lastIndex == -1) { lastIndex = number.length; } var whole = number.substring(0, lastIndex); var precision = number.substring(lastIndex); for (i=0; i < chars.length; i++) { whole = whole.replace(chars[i], ''); precision = precision.replace(chars[i],'.'); } number = whole + precision; f = parseFloat(number); return f; } 

essaye ça:

 alert(normalizeFloat('12.345,77', [',','.']).toFixed(2)); alert(normalizeFloat('12,345.77', [',','.']).toFixed(2));