Normalmente, você deve considerar o uso de campos de entrada que não permitem a entrada de texto livre para valores numéricos. Mas pode haver casos em que você precisa adivinhar o formato de entrada. Por exemplo 1.234,56 na Alemanha significa 1.234,56 nos EUA. Consulte https://salesforce.stackexchange.com/a/21404 para obter uma lista de países que usam vírgula como decimal.
Eu uso a seguinte função para fazer uma melhor estimativa e remover todos os caracteres não 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);
}
Experimente aqui: https://plnkr.co/edit/9p5Y6H?p=preview
Exemplos:
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
A função tem um ponto fraco: não é possível adivinhar o formato se você tiver 1.123 ou 1.123 - porque dependendo do formato do local, ambos podem ser uma vírgula ou um separador de milhares. Neste caso especial, a função tratará o separador como um separador de milhares e retornará 1123.