Sau đây có thể hữu ích trong điều khoản chung.
Đầu tiên, các trường mẫu HTML được giới hạn trong văn bản . Điều đó đặc biệt áp dụng cho các hộp văn bản, ngay cả khi bạn đã chịu khó để đảm bảo rằng giá trị trông giống như một con số.
Thứ hai, JavaScript, tốt hơn hoặc xấu hơn, đã làm quá tải +
toán tử với hai ý nghĩa: nó thêm số và nó nối chuỗi. Nó có sở thích ghép nối, do đó, ngay cả một biểu thức như thế 3+'4'
cũng sẽ được coi là nối.
Thứ ba, JavaScript sẽ cố gắng thay đổi các loại động nếu có thể và nếu cần. Ví dụ: '2'*'3'
sẽ thay đổi cả hai loại thành số, vì bạn không thể nhân chuỗi. Nếu một trong số chúng không tương thích, bạn sẽ nhận được NaN
, Không phải là Số.
Vấn đề của bạn xảy ra bởi vì dữ liệu đến từ biểu mẫu được coi là một chuỗi và +
do đó sẽ được nối thay vì thêm.
Khi đọc dữ liệu được cho là số từ một biểu mẫu, bạn phải luôn đẩy nó qua parseInt()
hoặc parseFloat()
, tùy thuộc vào việc bạn muốn số nguyên hay số thập phân.
Lưu ý rằng không có hàm nào thực sự chuyển đổi một chuỗi thành một số. Thay vào đó, nó sẽ phân tích chuỗi từ trái sang phải cho đến khi nó đến một ký tự số không hợp lệ hoặc đến cuối và chuyển đổi những gì đã được chấp nhận. Trong trường hợpparseFloat
, bao gồm một dấu thập phân, nhưng không phải hai.
Bất cứ điều gì sau khi số hợp lệ chỉ đơn giản là bỏ qua. Họ thất bại nếu chuỗi thậm chí không bắt đầu như một số. Rồi bạn sẽ nhận được NaN
.
Một kỹ thuật mục đích chung tốt cho các số từ các hình thức là như thế này:
var data=parseInt(form.elements['data'].value); // or parseFloat
Nếu bạn chuẩn bị kết hợp một chuỗi không hợp lệ thành 0, bạn có thể sử dụng:
var data=parseInt(form.elements['data'].value) || 0;