Por lo general, debe considerar el uso de campos de entrada que no permitan la entrada de texto libre para valores numéricos. Pero puede haber casos en los que necesite adivinar el formato de entrada. Por ejemplo, 1.234,56 en Alemania significa 1.234,56 en EE. UU. Consulte https://salesforce.stackexchange.com/a/21404 para obtener una lista de países que utilizan coma como decimal.
Utilizo la siguiente función para hacer una mejor estimación y eliminar todos los caracteres no numéricos:
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);
}
Pruébelo aquí: https://plnkr.co/edit/9p5Y6H?p=preview
Ejemplos:
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 función tiene un punto débil: no es posible adivinar el formato si tiene 1.123 o 1.123, porque dependiendo del formato de la configuración regional, ambos pueden ser una coma o un separador de miles. En este caso especial, la función tratará el separador como un separador de miles y devolverá 1123.