Zwykle należy rozważyć użycie pól wejściowych, które nie pozwalają na dowolne wprowadzanie tekstu dla wartości liczbowych. Ale mogą być przypadki, kiedy trzeba odgadnąć format wejściowy. Na przykład 1,234,56 w Niemczech oznacza 1234,56 w USA. Wejdź na https://salesforce.stackexchange.com/a/21404, aby zapoznać się z listą krajów, w których przecinek jest dziesiętny.
Używam następującej funkcji, aby zgadnąć i usunąć wszystkie znaki nienumeryczne:
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);
}
Wypróbuj tutaj: https://plnkr.co/edit/9p5Y6H?p=preview
Przykłady:
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
Funkcja ma jeden słaby punkt: nie można odgadnąć formatu, jeśli masz 1,123 lub 1,123 - ponieważ w zależności od formatu ustawień regionalnych oba mogą być przecinkiem lub separatorem tysięcy. W tym szczególnym przypadku funkcja potraktuje separator jako separator tysięcy i zwróci 1123.