Зазвичай слід розглянути можливість використання полів введення, які не дозволяють вводити вільний текст для числових значень. Але можуть бути випадки, коли вам потрібно вгадати формат введення. Наприклад, у Німеччині 1,234,56 означає 1,234,56 у США. Дивіться https://salesforce.stackexchange.com/a/21404 для списку країн, які використовують коми як десяткові.
Я використовую наступну функцію, щоб найкраще відгадати та зняти всі нечислові символи:
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);
}
Спробуйте тут: https://plnkr.co/edit/9p5Y6H?p=preview
Приклади:
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
У функції є одна слабка сторона: неможливо здогадатися про формат, якщо у вас є 1,123 або 1.123 - тому що залежно від формату мови обидва можуть бути комою або роздільником тисяч. У цьому спеціальному випадку функція буде розглядати роздільник як роздільник тисяч і повертати 1123.