Di solito dovresti considerare di utilizzare campi di input che non consentono l'immissione di testo libero per valori numerici. Ma potrebbero esserci casi in cui è necessario indovinare il formato di input. Ad esempio 1.234,56 in Germania significa 1.234.56 negli Stati Uniti. Vedere https://salesforce.stackexchange.com/a/21404 per un elenco di paesi che utilizzano la virgola come decimale.
Uso la seguente funzione per fare un'ipotesi migliore e rimuovere tutti i caratteri non numerici:
function parseNumber(strg) {
var strg = strg || "";
var decimal = '.';
strg = strg.replace(/[^0-9$.,]/g, '');
if(strg.indexOf(',') > strg.indexOf('.')) decimal = ',';
if((strg.match(new RegExp("\\" + decimal,"g")) || []).length > 1) decimal="";
if (decimal != "" && (strg.length - strg.indexOf(decimal) - 1 == 3) && strg.indexOf("0" + decimal)!==0) decimal = "";
strg = strg.replace(new RegExp("[^0-9$" + decimal + "]","g"), "");
strg = strg.replace(',', '.');
return parseFloat(strg);
}
Provalo qui: https://plnkr.co/edit/9p5Y6H?p=preview
Esempi:
1.234,56 € => 1234.56
1,234.56USD => 1234.56
1,234,567€ => 1234567
1.234.567 => 1234567
1,234.567 => 1234.567
1.234 => 1234 // might be wrong - best guess
1,234 => 1234 // might be wrong - best guess
1.2345 => 1.2345
0,123 => 0.123
La funzione ha un punto debole: non è possibile indovinare il formato se si dispone di 1.123 o 1.123, perché a seconda del formato locale entrambi potrebbero essere una virgola o un separatore delle migliaia. In questo caso speciale la funzione tratterà separator come un separatore di migliaia e restituirà 1123.