Cara memaksa JS melakukan matematika alih-alih menyatukan dua string

102

Saya perlu javascript untuk menambahkan 5 ke variabel integer, tetapi ia memperlakukan variabel sebagai string, jadi ia menulis variabel tersebut, lalu menambahkan 5 di akhir "string". Bagaimana saya bisa memaksanya untuk melakukan matematika?

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

Keluaran: 55

Bagaimana saya bisa memaksanya menjadi keluaran 10?

Sean
sumber
3
Contoh khusus ini menghasilkan 10.
menipu
10
Anda telah memberikan beban yang tidak semestinya pada mereka yang ingin membantu Anda dengan membuang semua kode Anda tanpa berusaha untuk menguranginya. Ujilah sendiri ... apakah atribut CSS #controlmembuat perbedaan pada masalah Anda? Jika tidak, hapus saja dan jangan tunjukkan kepada kami. Terus kurangi kode Anda sampai Anda memiliki kasus uji minimum absolut yang diperlukan untuk mereproduksi masalah Anda. Sering kali melakukannya akan menyebabkan Anda menemukan masalah dan belajar dalam prosesnya. Jika Anda tidak menyelesaikannya sendiri, kemungkinan besar Anda akan mendapatkan bantuan cepat dengan contoh sederhana Anda.
Phrogz

Jawaban:

108

Anda memiliki garis

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

di file Anda, ini akan menetapkan titik menjadi string karena konten txt tidak dibatasi ke angka.

untuk mengubahnya menjadi int, ubah baris menjadi:

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

Catatan: Di 10sini menentukan desimal (basis-10). Tanpa ini beberapa browser mungkin tidak menafsirkan string dengan benar. Lihat MDN: parseInt.

Alex
sumber
3
shortcut ... dots = + document.getElementById ("txt"). value
Tracker1
5
parseInt (..., 10) juga, selalu gunakan radix ... pemeriksaan kewarasan ... jika (! dots || dots <1) mungkin juga berurutan ...
Tracker1
1
Lebih baik gunakan operator increment untuk Penambahan. seperti VARIABLE ++, bukan VAR = VAR + 1;
gnganpath
54

yang paling sederhana:

dots = dots*1+5;

titik-titik tersebut akan diubah menjadi angka.

mier
sumber
34
Bahkan lebih sederhana dari itu dots = +dots+5.
Andy E
20

JANGAN LUPA - Gunakan parseFloat();jika Anda berurusan dengan desimal.

Nicolas
sumber
2
Dan jangan lupa bahwa float bukanlah tipe data desimal stackoverflow.com/questions/588004/…
Tedd Hansen
Gunakan saja Number.
user4642212
9

Saya menambahkan jawaban ini karena saya tidak melihatnya di sini.

Salah satu caranya adalah dengan meletakkan karakter '+' di depan nilai

contoh:

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

x === 15

Saya telah menemukan ini sebagai cara yang paling sederhana

Dalam hal ini, baris:

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

bisa diubah menjadi

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

untuk memaksanya menjadi angka

CATATAN:

+'' === 0
+[] === 0
+[5] === 5
+['5'] === 5
Christopher Strolia-Davis
sumber
8

parseInt() harus melakukan triknya

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

Memberi anda

sum == 35
pin == "2510"

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

Catatan: 10in parseInt(number, 10)menentukan desimal (basis-10). Tanpa ini beberapa browser mungkin tidak menafsirkan string dengan benar. Lihat MDN: parseInt.

Alan L.
sumber
3

Ini juga berfungsi untuk Anda:

dots -= -5;
Holger.Buick
sumber
hebat kita tidak perlu menulis ulang var pertama
bormat
1

itu sangat sederhana saja

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

ini memaksa javascript untuk berkembang biak karena tidak ada kebingungan untuk * masuk javascript.

Nelson Cajetin Diego Alfonso
sumber
1

Anda dapat menambahkan + di belakang variabel dan itu akan memaksanya menjadi integer

var dots = 5
    function increase(){
        dots = +dots + 5;
    }
Hassan Ali Salem
sumber
1

Setelah mencoba sebagian besar jawaban di sini tanpa hasil untuk kasus khusus saya, saya menemukan ini:

dots = -(-dots - 5);

Tanda + adalah yang membingungkan js, dan ini menghilangkannya sama sekali. Mudah diterapkan, jika berpotensi membingungkan untuk dipahami.

Jay Reeve
sumber
-3

DIPERBARUI sejak ini terakhir kali mendapat suara negatif ....

Saya hanya melihat porsinya

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

sebelumnya, tetapi kemudian ditunjukkan kepada saya bahwa txtkotak itu memberi makan variabel dots. Karena itu, Anda harus yakin untuk "membersihkan" masukan, untuk memastikan itu hanya memiliki bilangan bulat, dan bukan kode berbahaya.

Salah satu cara mudah untuk melakukannya adalah dengan mengurai kotak teks dengan onkeyup()peristiwa untuk memastikannya memiliki karakter numerik:

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

dimana acara tersebut akan memberikan kesalahan dan menghapus karakter terakhir jika nilainya bukan angka:

<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>

Jelas Anda bisa melakukannya dengan regex juga, tapi saya mengambil jalan keluarnya dengan malas.

Sejak saat itu Anda akan tahu bahwa hanya angka yang bisa ada di dalam kotak, Anda seharusnya bisa menggunakan eval():

dots = eval(dots) + 5;
vapcguy
sumber
2
eval()berbahaya jika dotsberasal dari masukan pengguna, terutama jika dari masukan yang disimpan. Informasi lebih lanjut
Chad Levy
@ChadLevy Terima kasih atas tautannya - bacaan yang bagus - dan mengungkit hal ini, tetapi dalam kasus ini kekhawatiran itu tidak beralasan, karena bukan dari masukan pengguna. dotsadalah variabel yang ditentukan yang sedang bertambah dan hanya disalahartikan sebagai string. Jadi saya akan mengkualifikasikan jawaban saya bahwa itu tidak boleh digunakan dengan mudah, seperti yang Anda katakan, dari input pengguna / tersimpan yang dapat berpotensi untuk injeksi skrip jahat. Tetapi juga dalam kasus ini, injeksi semacam itu akan menyebabkan kesalahan / pengecualian matematika, jadi itu benar-benar tidak akan melakukan apa pun.
vapcguy
Bagi mereka yang downvoting karena menurut Anda eval()sangat berbahaya, Anda perlu melihat kode dalam konteks yang digunakan OP. Ini bukan, dalam kasus ini, karena dia menggunakan input yang tidak berasal dari kotak teks atau bentuk input pengguna lainnya di mana mungkin ada bentuk injeksi apa pun dari nilai non-numerik! Saya berharap saya bisa menurunkan suara negatif Anda!
vapcguy
Downvoter lainnya. Mau menjelaskan diri Anda sendiri, bukan hanya menjadi domba? Ada kalanya eval()baik-baik saja, dan Anda perlu melihat konteks yang digunakannya, alih-alih hanya mempercayai semua yang Anda baca tanpa benar-benar memahaminya!
vapcguy
1
@ChadLevy Ok, dalam hal itu, Anda benar. Saya tidak melihat bagian itu - saya fokus pada apa yang dia letakkan di bagian atas halaman: kode var dots = 5 function increase(){ dots = dots+5; }tidak menggunakan bidang teks, dan menetapkan menggunakan variabel langsung, bukan dari input pengguna. Jadi itulah yang saya lakukan. Tapi saya melihat Anda benar bahwa dia menetapkan bidang teks itu txtke dots, dan dotsmerupakan variabel global, dan karenanya diperbarui oleh masukan itu. Kamu benar. Terima kasih.
vapcguy