Thông thường, bạn nên cân nhắc sử dụng các trường nhập không cho phép nhập văn bản miễn phí cho các giá trị số. Nhưng có thể có những trường hợp, khi bạn cần đoán định dạng đầu vào. Ví dụ: 1.234,56 ở Đức nghĩa là 1.234,56 ở Mỹ. Xem https://salesforce.stackexchange.com/a/21404 để biết danh sách các quốc gia sử dụng dấu phẩy dưới dạng số thập phân.
Tôi sử dụng hàm sau để phỏng đoán chính xác nhất và loại bỏ tất cả các ký tự không phải số:
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);
}
Hãy thử nó tại đây: https://plnkr.co/edit/9p5Y6H?p=preview
Ví dụ:
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
Hàm có một điểm yếu: Không thể đoán định dạng nếu bạn có 1,123 hoặc 1,123 - vì tùy thuộc vào định dạng ngôn ngữ, cả hai có thể là dấu phẩy hoặc dấu phân cách hàng nghìn. Trong trường hợp đặc biệt này, hàm sẽ coi dấu phân tách là dấu phân cách hàng nghìn và trả về 1123.