Cách buộc JS làm toán thay vì đặt hai chuỗi lại với nhau


102

Tôi cần javascript để thêm 5 vào một biến số nguyên, nhưng thay vào đó nó xử lý biến đó như một chuỗi, vì vậy nó viết biến ra, sau đó thêm 5 vào cuối "chuỗi". Làm thế nào tôi có thể buộc nó làm toán thay thế?

var dots = document.getElementById("txt").value; // 5
function increase(){
    dots = dots + 5;
}

Đầu ra: 55

Làm thế nào tôi có thể buộc nó xuất ra 10?


3
Ví dụ cụ thể này cho kết quả là 10.
Deceze


10
Bạn đã đặt một gánh nặng quá mức cho những người muốn giúp bạn bằng cách bán tất cả mã của bạn mà không thực hiện bất kỳ nỗ lực nào để sửa chữa nó. Hãy tự mình kiểm tra ... các thuộc tính CSS #controlcó tạo ra sự khác biệt nào cho vấn đề của bạn không? Nếu không, sau đó xóa chúng và không hiển thị chúng cho chúng tôi. Tiếp tục giảm mã của bạn cho đến khi bạn có trường hợp thử nghiệm tối thiểu tuyệt đối cần thiết để tái tạo sự cố của mình. Hầu hết thời gian làm như vậy sẽ khiến bạn tìm ra vấn đề học hỏi trong quá trình này. Nếu bạn không tự mình giải quyết thì rất có thể bạn sẽ được trợ giúp nhanh chóng với ví dụ đơn giản của mình.
Phrogz

Câu trả lời:


108

Bạn có dòng

dots = document.getElementById("txt").value;

trong tệp của bạn, điều này sẽ đặt các dấu chấm thành một chuỗi vì nội dung của txt không bị giới hạn ở một số.

để chuyển nó thành int, hãy thay đổi dòng thành:

dots = parseInt(document.getElementById("txt").value, 10);

Lưu ý: Ở 10đây chỉ định số thập phân (cơ số 10). Nếu không có điều này, một số trình duyệt có thể không giải thích chuỗi một cách chính xác. Xem MDN: parseInt.


3
shortcut ... chấm = + document.getElementById ( "txt") giá trị.
Tracker1

5
(! chấm || chấm <1) parseInt (..., 10) cũng vậy, luôn luôn sử dụng một cơ số ... một kiểm tra sanity ... nếu có thể để quá ...
Tracker1

1
Tốt hơn hãy sử dụng toán tử gia tăng cho Phép cộng. như VARIABLE ++ thay vì VAR = VAR + 1;
gnganpath

53

điều đơn giản nhất:

dots = dots*1+5;

các dấu chấm sẽ được chuyển thành số.


34
Thậm chí còn đơn giản hơn thế dots = +dots+5.
Andy E


9

Tôi đang thêm câu trả lời này vì tôi không thấy nó ở đây.

Một cách là đặt ký tự '+' trước giá trị

thí dụ:

var x = +'11.5' + +'3.5'

x === 15

Tôi thấy đây là cách đơn giản nhất

Trong trường hợp này, dòng:

dots = document.getElementById("txt").value;

có thể được thay đổi thành

dots = +(document.getElementById("txt").value);

buộc nó thành một số

GHI CHÚ:

+'' === 0
+[] === 0
+[5] === 5
+['5'] === 5

8

parseInt() nên làm thủ thuật

var number = "25";
var sum = parseInt(number, 10) + 10;
var pin = number + 10;

Mang đến cho bạn

sum == 35
pin == "2510"

http://www.w3schools.com/jsref/jsref_parseint.asp

Lưu ý: 10trong parseInt(number, 10)quy định cụ thể thập phân (cơ số 10). Nếu không có điều này, một số trình duyệt có thể không giải thích chuỗi một cách chính xác. Xem MDN: parseInt.


3

Điều này cũng hoạt động cho bạn:

dots -= -5;

lớn chúng ta không cần phải viết lại var đầu tiên
bormat

1

nó thực sự đơn giản

var total = (1 * yourFirstVariablehere) + (1 * yourSecondVariablehere)

điều này buộc javascript phải nhân lên vì không có sự nhầm lẫn cho dấu * trong javascript.


1

Bạn có thể thêm + vào sau biến và nó sẽ buộc nó phải là một số nguyên

var dots = 5
    function increase(){
        dots = +dots + 5;
    }

1

Sau khi thử hầu hết các câu trả lời ở đây mà không thành công cho trường hợp cụ thể của tôi, tôi đã nghĩ ra điều này:

dots = -(-dots - 5);

Các dấu + là thứ gây nhầm lẫn cho js và điều này loại bỏ chúng hoàn toàn. Đơn giản để thực hiện, nếu có thể khó hiểu.


-3

CẬP NHẬT kể từ lần cuối cùng bị phản đối ...

Tôi chỉ nhìn thấy một phần

var dots = 5
function increase(){
    dots = dots+5;
}

trước đó, nhưng sau đó nó đã được hiển thị cho tôi rằng txthộp cung cấp biến dots. Bởi vì điều này, bạn sẽ cần phải đảm bảo "làm sạch" đầu vào, để đảm bảo rằng nó chỉ có số nguyên chứ không phải mã độc hại.

Một cách dễ dàng để làm điều này là phân tích cú pháp hộp văn bản với một onkeyup()sự kiện để đảm bảo nó có các ký tự số:

<input size="40" id="txt" value="Write a character here!" onkeyup="GetChar (event);"/>

trong đó sự kiện sẽ đưa ra lỗi và xóa ký tự cuối cùng nếu giá trị không phải là số:

<script type="text/javascript">
    function GetChar (event){
        var keyCode = ('which' in event) ? event.which : event.keyCode;
        var yourChar = String.fromCharCode();
        if (yourChar != "0" &&
            yourChar != "1" &&
            yourChar != "2" &&
            yourChar != "3" && 
            yourChar != "4" &&
            yourChar != "5" &&
            yourChar != "6" && 
            yourChar != "7" &&
            yourChar != "8" && 
            yourChar != "9")
        {
            alert ('The character was not a number');
            var source = event.target || event.srcElement;
            source.value = source.value.substring(0,source.value-2);
        }
    }
</script>

Rõ ràng là bạn cũng có thể làm điều đó với regex, nhưng tôi đã chọn cách lười biếng.

Từ đó, bạn sẽ biết rằng chỉ có các số trong hộp, bạn có thể chỉ sử dụng eval():

dots = eval(dots) + 5;

2
eval()sẽ nguy hiểm nếu dotslà từ đầu vào của người dùng, đặc biệt nếu từ đầu vào được lưu trữ. Thông tin thêm
Chad Levy

@ChadLevy Cảm ơn liên kết - một bài đọc tốt - và đưa ra điều này, nhưng trong trường hợp này, mối quan tâm là không chính đáng, vì nó không phải từ đầu vào của người dùng. dotslà một biến xác định đang được tăng dần và chỉ bị nhầm với một chuỗi. Vì vậy, tôi sẽ đủ điều kiện cho câu trả lời của mình rằng nó không nên được sử dụng nhẹ nhàng, như bạn đã nói, từ đầu vào của người dùng / được lưu trữ có thể tiềm ẩn nguy cơ tiêm kịch bản xấu. Nhưng cũng trong trường hợp này, dù sao thì việc tiêm như vậy sẽ gây ra lỗi / ngoại lệ toán học, vì vậy nó thực sự sẽ không làm được gì cả.
vapcguy

Đối với những người phản đối vì bạn nghĩ eval()là rất nguy hiểm, bạn cần phải xem mã trong ngữ cảnh OP đang sử dụng. Trong trường hợp này thì không, bởi vì anh ta đang sử dụng đầu vào không đến từ hộp văn bản hoặc bất kỳ hình thức nhập liệu nào khác của người dùng, nơi có thể có bất kỳ hình thức chèn giá trị không phải số nào! Tôi ước tôi có thể phản đối phản đối của bạn!
vapcguy

Một người khác. Quan tâm để giải thích cho bản thân, thay vì chỉ là một con cừu? Có những lúc eval()nó vẫn ổn, và bạn cần nhìn vào ngữ cảnh mà nó đang được sử dụng, thay vì chỉ tin một cách mù quáng vào mọi thứ bạn đọc mà không thực sự hiểu nó!
vapcguy

1
@ChadLevy Ok, về điều đó, bạn đã đúng. Tôi đã không xem phần đó - tôi tập trung vào những gì anh ấy đặt ở đầu trang: mã var dots = 5 function increase(){ dots = dots+5; }không sử dụng trường văn bản và chỉ định bằng cách sử dụng các biến trực tiếp, không phải từ đầu vào của người dùng. Vì vậy, đó là những gì tôi đã bỏ ra. Nhưng tôi thấy bạn nói đúng khi anh ấy gán trường văn bản đó txtcho dotsdotslà một biến toàn cục, và do đó, được cập nhật bởi đầu vào đó. Bạn đúng. Cảm ơn.
vapcguy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.