Pertanyaan Bagaimana cara mengonversi string ke dalam bilangan bulat di JavaScript?


Bagaimana cara mengonversi string menjadi integer di JavaScript?


1372
2017-07-15 20:22


asal


Jawaban:


Cara termudah adalah menggunakan penduduk asli Number fungsi:

var x = Number("1000")

Jika itu tidak berhasil untuk Anda, maka ada parseInt, unary plus, parseFloat dengan lantai, dan Math.round metode.

parseInt:

var x = parseInt("1000", 10); // you want to use radix 10
    // so you get a decimal number even with a leading 0 and an old browser ([IE8, Firefox 20, Chrome 22 and older][1])

unary plus jika string Anda sudah dalam bentuk bilangan bulat:

var x = +"1000";

jika string Anda atau mungkin float dan Anda menginginkan integer:

var x = Math.floor("1000.01"); //floor automatically converts string to number

atau, jika Anda akan menggunakan Math.floor beberapa kali:

var floor = Math.floor;
var x = floor("1000.01");

Jika Anda adalah tipe yang lupa untuk memasukkan radix ketika Anda memanggil parseInt, Anda dapat menggunakan parseFloat dan membulatkannya sesuai keinginan Anda. Di sini saya menggunakan lantai.

var floor = Math.floor;
var x = floor(parseFloat("1000.01"));

Menariknya, Math.round (seperti Math.floor) akan melakukan string ke nomor konversi, jadi jika Anda ingin nomor dibulatkan (atau jika Anda memiliki integer dalam string), ini adalah cara yang hebat, mungkin favorit saya:

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)

1747
2017-07-15 20:28



Coba fungsi parseInt:

var number = parseInt("10");

Tetapi ada masalah. Jika Anda mencoba mengonversi "010" menggunakan fungsi parseInt, ia mendeteksi sebagai nomor oktal, dan akan mengembalikan angka 8. Jadi, Anda perlu menentukan radix (dari 2 hingga 36). Dalam hal ini basis 10.

parseInt(string, radix)

Contoh:

var result = parseInt("010", 10) == 10; // Returns true

var result = parseInt("010") == 10; // Returns false

192
2017-07-15 20:23



Ada dua cara utama untuk mengonversi string ke angka dalam javascript. Salah satu caranya adalah menguraikannya dan cara lainnya adalah mengubah jenisnya menjadi Angka. Semua trik dalam jawaban yang lain (misalnya unary plus) melibatkan secara implisit memaksa jenis string ke angka. Anda juga dapat melakukan hal yang sama secara eksplisit dengan fungsi Angka.

Parsing

var parsed = parseInt("97", 10);

parseInt dan parseFloat adalah dua fungsi yang digunakan untuk string parsing ke angka. Parsing akan berhenti secara diam-diam jika hits karakter yang tidak dikenali, yang dapat berguna untuk string parsing seperti "92px", tetapi juga agak berbahaya, karena tidak akan memberi Anda jenis kesalahan pada input yang buruk, bukan Anda Akan kembali NaN kecuali string dimulai dengan angka. Spasi pada awal string diabaikan. Berikut ini contohnya melakukan sesuatu yang berbeda dengan yang Anda inginkan, dan tidak memberi indikasi bahwa ada yang salah:

var widgetsSold = parseInt("97,800", 10); // widgetsSold is now 97

Ini praktik yang baik untuk selalu menentukan radix sebagai argumen kedua. Di browser yang lebih lama, jika string dimulai dengan 0, itu akan ditafsirkan sebagai oktal jika radix tidak ditentukan yang membuat banyak orang terkejut. Perilaku untuk heksadesimal dipicu dengan memulai string dengan 0x jika tidak ada radix yang ditentukan, mis. 0xff. Standar benar-benar berubah dengan ecmascript 5, sehingga peramban modern tidak lagi memicu oktal ketika ada awalan 0 jika tidak ada radix yang ditentukan. parseInt memahami radix hingga ke basis 36, dalam hal ini huruf besar dan huruf kecil diperlakukan sebagai ekuivalen.

Mengubah Jenis String ke Angka

Semua trik lain yang disebutkan di atas yang tidak menggunakan parseInt, melibatkan secara implisit memaksa string menjadi angka. Saya lebih suka melakukan ini secara eksplisit,

var cast = Number("97");

Ini memiliki perilaku yang berbeda dengan metode parse (meskipun masih mengabaikan spasi). Ini lebih ketat: jika tidak mengerti seluruh string dari itu kembali NaN, jadi Anda tidak bisa menggunakannya untuk string seperti 97px. Karena Anda menginginkan nomor primitif daripada objek pembungkus Nomor, pastikan Anda tidak meletakkannya new di depan fungsi Nomor.

Jelas, mengonversi ke Angka memberi Anda nilai yang mungkin berupa pelampung bukan bilangan bulat, jadi jika Anda menginginkan bilangan bulat, Anda perlu memodifikasinya. Ada beberapa cara untuk melakukan ini:

var rounded = Math.floor(Number("97.654"));  // other options are Math.ceil, Math.round
var fixed = Number("97.654").toFixed(0); // rounded rather than truncated
var bitwised = Number("97.654")|0;  // do not use for large numbers

Setiap operator bitwise (di sini saya sudah melakukan bitwise atau, tetapi Anda juga bisa melakukan negasi ganda seperti pada jawaban sebelumnya atau bitshift) akan mengkonversi nilai ke integer 32 bit, dan sebagian besar dari mereka akan dikonversi ke integer bertanda tangan. Perhatikan bahwa ini tidak akan menginginkan yang Anda inginkan untuk bilangan bulat besar. Jika bilangan bulat tidak dapat diwakili dalam 32bits, itu akan membungkus.

~~"3000000000.654" === -1294967296
// This is the same as
Number("3000000000.654")|0
"3000000000.654" >>> 0 === 3000000000 // unsigned right shift gives you an extra bit
"300000000000.654" >>> 0 === 3647256576 // but still fails with larger numbers

Untuk bekerja dengan benar dengan angka yang lebih besar, Anda harus menggunakan metode pembulatan

Math.floor("3000000000.654") === 3000000000
// This is the same as
Math.floor(Number("3000000000.654"))

Ingatlah bahwa semua metode ini memahami notasi eksponensial, jadi 2e2 aku s 200 daripada NaN. Selain itu, Nomor memahami "Infinity", sedangkan metode parsing tidak.

Adat

Tidak mungkin salah satu metode ini tepat seperti yang Anda inginkan. Sebagai contoh, biasanya saya ingin kesalahan dilemparkan jika parsing gagal, dan saya tidak memerlukan dukungan untuk Infinity, eksponensial atau spasi putih terkemuka. Tergantung pada usecase Anda, kadang-kadang masuk akal untuk menulis fungsi konversi kustom.

Selalu periksa bahwa output Nomor atau salah satu metode parse adalah jenis nomor yang Anda harapkan. Anda hampir pasti ingin menggunakannya isNaN untuk memastikan nomornya bukan NaN (biasanya satu-satunya cara Anda mengetahui bahwa parse gagal).


107
2017-12-11 07:47



ParseInt () dan + berbeda

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456

50
2018-03-14 09:54



Padahal pertanyaan lama, tapi mungkin ini bisa membantu seseorang.

Saya menggunakan cara mengubah string ke int jumlah

var str = "25";       // string
var number = str*1;   // number

Jadi, ketika mengalikan dengan 1, nilai tidak berubah, tetapi js secara otomatis mengembalikan angka.

Tetapi seperti yang ditunjukkan di bawah ini, ini harus digunakan jika Anda yakin bahwa str adalah angka (atau dapat direpresentasikan sebagai angka), jika tidak maka akan mengembalikan NaN - bukan angka.

Anda dapat membuat fungsi sederhana untuk digunakan, mis.

function toNumber(str) {
   return str*1;
}

enter image description here


35
2018-03-16 18:24



Coba parseInt.

var number = parseInt("10", 10); //number will have value of 10.

31
2017-07-15 20:23



Saya memposting jawaban yang salah di sini, maaf. tetap.

Ini pertanyaan lama, tapi saya suka trik ini:

~~"2.123"; //2
~~"5"; //5

Negatif bitwise ganda menurun dari apa pun setelah titik desimal DAN mengubahnya menjadi format angka. Saya diberi tahu bahwa ini sedikit lebih cepat daripada memanggil fungsi dan yang lainnya, tapi saya tidak sepenuhnya yakin.

EDIT: Metode lain yang baru saya lihat sini (pertanyaan tentang operator javascript >>>, yang merupakan pergeseran kanan nol-mengisi) yang menunjukkan bahwa menggeser angka dengan 0 dengan operator ini mengubah nomor ke uint32 yang bagus jika Anda juga menginginkannya unsigned. Sekali lagi, ini berubah menjadi unsigned integer, yang dapat menyebabkan perilaku aneh jika Anda menggunakan nomor yang ditandatangani.

"-2.123" >>> 0; // 4294967294
"2.123" >>> 0; // 2
"-5" >>> 0; // 4294967291
"5" >>> 0; // 5

25
2018-01-16 09:51



Hati-hati jika Anda menggunakan parseInt untuk mengonversi float dalam notasi ilmiah! Sebagai contoh:

parseInt("5.6e-14") 

akan menghasilkan

5 

dari pada

0

18
2017-07-01 06:48



Juga sebagai catatan samping: Mootools memiliki fungsi toInt () yang digunakan pada sembarang string asli (atau float (atau integer)).

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2

16
2017-07-16 20:05



Berikut ini sedikit perbandingan kecepatan (hanya Mac Os) ... :)

Untuk chrome 'plus' dan 'mul' adalah yang tercepat, 'Math.floor' paling lambat (> 700,000,00 op / detik). Untuk Firefox 'plus' paling lambat (!) 'Mul' adalah tercepat (> 900.000.000 op / detik). Di Safari 'parseInt' adalah fastes, 'number' paling lambat (tetapi resulats cukup mirip,> 13.000.000 <31.000.000). Jadi Safari untuk string cast ke int lebih dari 10x lebih lambat dari browser lain. Jadi pemenangnya adalah 'mul':)

Anda dapat menjalankannya di browser Anda dengan tautan ini https://jsperf.com/casttonumber

enter image description here


16
2018-03-27 21:42