Bagaimana cara mengubah string menjadi integer dalam JavaScript?

Jawaban:

2154

Cara paling sederhana adalah dengan menggunakan Numberfungsi asli :

var x = Number("1000")

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

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 memasukkan radix saat Anda memanggil parseInt, Anda dapat menggunakan parseFloat dan bulatkan sesuka Anda. Di sini saya menggunakan lantai.

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

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

var round = Math.round;
var x = round("1000"); //equivalent to round("1000",0)
Nosredna
sumber
1
jsperf.com/performance-of-parseint/29 , hy @jedierikb saya mengedit tautan jsperf. Menambahkan '4'>>0dan '4'>>>0.
emaniak
6
Pembaruan ke 2015: pada ECMAScript 5, string dengan nol "0" terdepan juga mendapatkan default radix 10, bukannya 8. Secara eksplisit menentukan radix 10 hanya diperlukan untuk browser yang lebih lama. kangax.github.io/compat-table/es5/…
Grilse
20
Perhatikan bahwa Angka ('') berhasil (mengembalikan 0), meskipun kebanyakan orang tidak akan menganggap string kosong untuk mewakili angka yang valid. Dan parseInt ('3q') berhasil (mengembalikan 3) meskipun kebanyakan orang tidak menganggap '3q' sebagai angka yang valid.
Dave Pacheco
3
Kepala. Baik parseIntdan parseFloatdengan senang hati menerima surat. Hanya Numbermengembalikan NaNsecara konsisten.
Karl Pokus
2
Menurut pendapat saya, parsing integer harus dihasilkan dengan pengecualian / NaNuntuk setiap nilai yang bukan integer. Oleh karena itu tidak ada yang sesuai sebagai Number('2.2')memaksa untuk 2dan Number('')memaksa ke 0.
Michał Knapik
225

Coba fungsi parseInt:

var number = parseInt("10");

Tapi ada masalah. Jika Anda mencoba mengonversi "010" menggunakan fungsi parseInt, ia mendeteksi sebagai angka 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

Perhatikan bahwa parseIntabaikan data buruk setelah memilah apa pun yang valid.
Panduan ini akan diuraikan sebagai 51:

var result = parseInt('51e3daf6-b521-446a-9f5b-a1bb4d8bac36', 10) == 51; // Returns true
Zanoni
sumber
4
Radix tidak lagi diperlukan pada 2016.
7
Mungkin tidak untuk browser yang lebih baru tetapi radix masih diperlukan untuk kompatibilitas ke belakang.
Profesor pemrograman
bagaimana dengan '', atau '02 "atau" 02 + 1 ", atau" 03,12 "atau" 03.12 "?
stackdave
3
Perhatikan bahwa ini mengabaikan data buruk setelah nomor. Misalnya, parseInt('0asdf', 10)menghasilkan 0.
Sam
121

Ada dua cara utama untuk mengonversi string ke angka dalam javascript. Salah satu caranya adalah menguraikannya dan cara lainnya adalah mengubah tipenya menjadi suatu Angka. Semua trik dalam jawaban lain (misalnya plus unary) melibatkan secara paksa memaksa jenis string ke nomor. 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 mem-parsing string ke angka. Parsing akan berhenti secara diam-diam jika mengenai karakter yang tidak dikenali, yang dapat berguna untuk mem-parsing string seperti "92px", tetapi itu juga agak berbahaya, karena itu tidak akan memberi Anda segala jenis kesalahan pada input yang buruk, sebagai gantinya Anda akan kembali NaN kecuali string dimulai dengan angka. Spasi pada awal string diabaikan. Berikut ini contoh melakukan sesuatu yang berbeda dengan yang Anda inginkan, dan tidak memberikan 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 mengejutkan banyak orang. Perilaku untuk heksadesimal dipicu dengan memiliki string mulai dengan 0x jika tidak ada radix yang ditentukan, misalnya 0xff. Standar sebenarnya berubah dengan ecmascript 5, jadi browser modern tidak lagi memicu oktal ketika ada 0 di awal jika tidak ada radix yang ditentukan. parseInt memahami radix hingga base 36, dalam hal ini huruf besar dan kecil diperlakukan sebagai setara.

Mengubah Jenis String ke Angka

Semua trik lain yang disebutkan di atas yang tidak menggunakan parseInt, melibatkan secara paksa 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 putih). Ini lebih ketat: jika tidak memahami keseluruhan string daripada mengembalikannya NaN, jadi Anda tidak dapat menggunakannya untuk string seperti 97px. Karena Anda menginginkan angka primitif daripada objek pembungkus Angka, pastikan Anda tidak meletakkan newdi depan fungsi Angka.

Jelas, mengonversi ke Angka memberi Anda nilai yang mungkin float daripada 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 telah melakukan bitwise atau, tetapi Anda juga bisa melakukan negasi ganda seperti pada jawaban sebelumnya atau bitshift) akan mengkonversi nilai menjadi integer 32bit, dan sebagian besar dari mereka akan dikonversi menjadi integer yang ditandatangani. Perhatikan bahwa ini tidak akan Anda inginkan untuk bilangan bulat besar . Jika integer tidak dapat direpresentasikan dalam 32 bit, itu akan dibungkus.

~~"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, sehingga 2e2adalah 200bukan NaN. Juga, Number mengerti "Infinity", sedangkan metode parse tidak.

Adat

Tidak mungkin kedua metode ini melakukan apa yang Anda inginkan. Sebagai contoh, biasanya saya ingin kesalahan dilempar jika parsing gagal, dan saya tidak memerlukan dukungan untuk Infinity, eksponensial atau memimpin spasi putih. Bergantung pada usecase Anda, terkadang masuk akal untuk menulis fungsi konversi khusus.

Selalu periksa bahwa output Number atau salah satu metode parse adalah jenis angka yang Anda harapkan. Anda hampir pasti ingin menggunakan isNaNuntuk memastikan nomornya bukan NaN (biasanya satu-satunya cara Anda mengetahui bahwa parse gagal).

kybernetikos
sumber
6
Itu tergantung apakah Anda ingin kode Anda juga menerima 97,8,00dan serupa atau tidak. Trik sederhana adalah dengan melakukan .replace(/[^0-9]/g, "")yang akan menghapus semua non digit dari string Anda dan kemudian melakukan konversi sesudahnya. Ini tentu saja akan mengabaikan semua jenis string gila yang Anda mungkin harus kesalahan pada bukan hanya parse ...
kybernetikos
6
@kybernetikos mungkin seharusnya .replace(/[^0-9.]/g, ""), jika "1.05" akan menjadi "105".
J.Steve
Cukup benar, walaupun saya toh tidak akan menggunakan sesuatu seperti itu untuk kode penting - ada begitu banyak cara yang dapat membiarkan sesuatu melalui Anda benar-benar tidak ingin membiarkan melalui.
kybernetikos
2
Saya menemukan menggunakan Nomor jauh lebih mudah dibaca dalam kode jadi terima kasih telah menunjukkannya sebagai solusi.
carlin.scott
1
@kybernetikos In var fixed = Number("97.654").toFixed(0); // rounded rather than truncated, kita mendapatkan string(karena .toFixedmetode) alih-alih number(integer). Jika kita ingin bilangan bulat bulat mungkin lebih baik menggunakan sajaMath.round("97.654");
Edu Zamora
50

ParseInt () dan + berbeda

parseInt("10.3456") // returns 10

+"10.3456" // returns 10.3456
Dalius I
sumber
36

Meskipun pertanyaan lama, tapi mungkin ini bisa membantu seseorang.

Saya menggunakan cara ini untuk mengkonversi string ke nomor int

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

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

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

Anda dapat membuat fungsi sederhana untuk digunakan, misalnya

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

masukkan deskripsi gambar di sini

dav
sumber
36

Tercepat

var x = "1000"*1;

Uji

Ini sedikit perbandingan kecepatan (hanya Mac Os) ... :)

Untuk chrome 'plus' dan 'mul' adalah yang tercepat (> 700,000,00 op / detik), 'Math.floor' paling lambat. Untuk Firefox 'plus' adalah paling lambat (!) 'Mul' adalah yang tercepat (> 900.000.000 op / detik). Di Safari, 'parseInt' adalah fastes, 'number' paling lambat (tetapi hasil yang hampir serupa,> 13.000.000 <31.000.000). Jadi Safari untuk string pemain 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/js-cast-str-to-number/1

masukkan deskripsi gambar di sini

Memperbarui

Saya juga menguji var x = ~~"1000";- di Chrome dan Safari sedikit lebih lambat dari var x = "1000"*1(<1%), di Firefox sedikit lebih cepat (<1%). Saya memperbarui gambar dan tes di atas

Kamil Kiełczewski
sumber
Tidak ada perbedaan yang signifikan antara hasil tes A, B, E dan F - semuanya pada dasarnya sama,
Alf Eaton
33

Coba parseInt.

var number = parseInt("10", 10); //number will have value of 10.
SolutionYogi
sumber
4
Anda mungkin ingin memasukkan radix dengan itu juga: var number = parseInt ("10", 10);
Joel Coehoorn
27

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

Ini pertanyaan lama, tapi saya suka trik ini:

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

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

EDIT: Metode lain yang baru saja saya lihat di sini (pertanyaan tentang operator javascript >>>, yang merupakan shift kanan isian nol) yang menunjukkan bahwa menggeser angka 0 dengan operator ini mengubah angka menjadi uint32 yang bagus jika Anda juga ingin itu tidak ditandatangani . Sekali lagi, ini dikonversi ke integer yang tidak ditandatangani , 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
Ian Ooi
sumber
19

Waspadalah jika Anda menggunakan parseInt untuk mengubah float dalam notasi ilmiah! Sebagai contoh:

parseInt("5.6e-14") 

akan menghasilkan

5 

dari pada

0
tom
sumber
14
Menggunakan parseInttidak akan berfungsi dengan baik untuk float. parseFloatberfungsi dengan baik dalam hal ini.
benekastah
16

Untuk mengkonversi String ke Integer, saya sarankan menggunakan parseFloat dan BUKAN parseInt. Inilah alasannya:

Menggunakan parseFloat:

parseFloat('2.34cms')  //Output: 2.34
parseFloat('12.5')     //Output: 12.5
parseFloat('012.3')    //Output: 12.3

Menggunakan parseInt:

parseInt('2.34cms')  //Output: 2
parseInt('12.5')     //Output: 12
parseInt('012.3')    //Output: 12

Jadi jika Anda telah memperhatikan parseInt membuang nilai setelah desimal, sedangkan parseFloat memungkinkan Anda bekerja dengan angka floating point dan karenanya lebih cocok jika Anda ingin mempertahankan nilai setelah desimal. Gunakan parseInt jika dan hanya jika Anda yakin Anda menginginkan nilai integer.

Devner
sumber
6
Pertanyaannya adalah "Bagaimana cara mengubah String menjadi integer dalam javascript"
Pierre Arlaud
15

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

"2".toInt()   // 2
"2px".toInt() // 2
2.toInt()     // 2
Henrik Hansen
sumber
7
Contoh ketiga menyebabkan a SyntaxError, Anda harus menggunakan titik ganda, misalnya: 2..toInt();titik pertama akan mengakhiri representasi Numberliteral dan titik kedua adalah pengakses properti.
CMS
2
pertanyaan ini bukan tentang mootool, ini tentang JavaScript.
Liam
14

Silakan lihat contoh di bawah ini. Ini akan membantu menghilangkan keraguan Anda

Example                  Result

parseInt("4")            4
parseInt("5aaa")         5
parseInt("4.33333")      4
parseInt("aaa");         NaN (means "Not a Number")

dengan menggunakan fungsi parseint. Ini hanya akan memberikan op integer sekarang dan bukan string

Zeeshan
sumber
12

kita bisa menggunakan +(stringOfNumber) daripada menggunakanparseInt(stringOfNumber)

Mis: +("21")mengembalikan int 21 sepertiparseInt("21") .

kita bisa menggunakan operator "+" unary ini untuk mem-parsing float juga ...

RevanthKrishnaKumar V.
sumber
1
Tetapi Anda tidak dapat menggunakannya dalam formula! Yaitu (1 + ("21")) * 10 === 1210!
Alexander Vasilyev
2
@AlexanderVasilyev Saya pikir Anda bisa, bukankah Anda hanya menggunakan tanda kurung tambahan di sekitar +?
NiCk Newman
@NiCkNewman saya mendapatkan + ("21") dari contoh di jawaban yang kami komentari.
Alexander Vasilyev
Saya sangat tidak suka solusi ini. Ini tidak eksplisit seperti apa parseIntadanya. Implementasi umum adalah const myNumber = +myNumberAsAStringyang terlihat seperti standar +=atau =+operator pada pandangan pertama. Juga Jika digunakan secara tidak benar dapat menyebabkan kesalahan penggabungan. Solusi ini didasarkan pada kenyataan bahwa 0 diasumsikan sebagai sisi kiri ketika tidak ada angka yang diberikan.
Storm Muller
10

Coba str - 0konversi stringmenjadi number.

> str = '0'
> str - 0
  0
> str = '123'
> str - 0
  123
> str = '-12'
> str - 0
  -12
> str = 'asdf'
> str - 0
  NaN
> str = '12.34'
> str - 0
  12.34

Berikut adalah dua tautan untuk membandingkan kinerja beberapa cara untuk mengubah string menjadi int

https://jsperf.com/number-vs-parseint-vs-plus

http://phrogz.net/js/string_to_number.html

zangw
sumber
1
@AlexanderYau, per dokumen ini , '1'akan dikonversi 1oleh oleh ToNumber, maka 1 - 0akan menjadi1
zangw
10

Ada banyak cara dalam JavaScript untuk mengonversi string ke nilai angka ... Semua sederhana dan praktis, pilih cara yang digunakan untuk Anda:

var num = Number("999.5"); //999.5
var num = parseInt("999.5", 10); //999
var num = parseFloat("999.5"); //999.5
var num = +"999.5"; //999.5

Juga setiap operasi Matematika mengubahnya menjadi angka, misalnya ...

var num = "999.5" / 1; //999.5
var num = "999.5" * 1; //999.5
var num = "999.5" - 1 + 1; //999.5
var num = "999.5" - 0; //999.5
var num = Math.floor("999.5"); //999
var num = ~~"999.5"; //999

Cara saya lebih suka menggunakan +tanda, yang merupakan cara elegan untuk mengkonversi string ke angka di JavaScript.

Alireza
sumber
8

Google memberi saya jawaban ini sebagai hasilnya, jadi ...

Saya sebenarnya perlu "menyimpan" string sebagai integer, untuk pengikatan antara C dan JavaScript, jadi saya mengonversi string menjadi nilai integer:

/*
    Examples:
        int2str( str2int("test") ) == "test" // true
        int2str( str2int("t€st") ) // "t¬st", because "€".charCodeAt(0) is 8364, will be AND'ed with 0xff
    Limitations:
        max 4 chars, so it fits into an integer
*/
function str2int(the_str) {
    var ret = 0;
    var len = the_str.length;
    if (len >= 1) ret += (the_str.charCodeAt(0) & 0xff) <<  0;
    if (len >= 2) ret += (the_str.charCodeAt(1) & 0xff) <<  8;
    if (len >= 3) ret += (the_str.charCodeAt(2) & 0xff) << 16;
    if (len >= 4) ret += (the_str.charCodeAt(3) & 0xff) << 24;
    return ret;
}
function int2str(the_int) {
    var tmp = [
        (the_int & 0x000000ff) >>  0,
        (the_int & 0x0000ff00) >>  8,
        (the_int & 0x00ff0000) >> 16,
        (the_int & 0xff000000) >> 24
    ];
    var ret = "";
    for (var i=0; i<4; i++) {
        if (tmp[i] == 0)
            break;
        ret += String.fromCharCode(tmp[i]);
    }
    return ret;
}
lama12345
sumber
4
Itu cara yang menarik untuk menyimpan dan mengambil nilai 4-byte. Itu tidak menjawab interpretasi konvensional dari pertanyaan: bagaimana mengkonversi representasi string dari angka menjadi nilai integer. Apapun, int2strfungsi Anda berhenti jika byte adalah 0, yang bisa menjadi elemen yang sah dalam nilai, jadi if... breakharus dihapus sehingga Anda mendapatkan nilai 4-byte lengkap yang dikembalikan.
Suncat2000
8

Menurut pendapat saya, tidak ada jawaban yang mencakup semua kasus tepi karena penguraian float akan menghasilkan kesalahan.

function parseInteger(value) {
    if(value === '') return NaN;
    const number = Number(value);
    return Number.isInteger(number) ? number : NaN;
}
parseInteger("4")            // 4
parseInteger("5aaa")         // NaN
parseInteger("4.33333")      // NaN
parseInteger("aaa");         // NaN
Michał Knapik
sumber
1
Returning Not A Number agak agresif untuk float, bukan begitu?
Thomas Ayoub
2
Ini parseInteger, tidak parseNumber. Saya kira setiap solusi merupakan solusi karena JS tidak mendukung bilangan bulat dan mengapung sebagai tipe terpisah. Kita bisa kembali nullsebagai ganti NaN, jika Not A Number menyesatkan.
Michał Knapik
4

Inilah solusi termudah

let myNumber = "123" | 0;

Solusi yang lebih mudah

let myNumber = +"123";
Thanveer Shah
sumber
2

semua hal di atas benar. Pastikan sebelumnya bahwa ini adalah angka dalam sebuah string dengan melakukan "typeot x === 'number'" jika tidak maka akan mengembalikan NaN

 var num = "fsdfsdf242342";
 typeof num => 'string';

 var num1 = "12423";
 typeof num1 => 'number';
 +num1 = > 12423`
Shahar ド ー ン Levi
sumber
Di simpul v8.5.0, var num1 = "12423"; typeof num1;kembali string.
Edu Zamora
2

Pilihan lain adalah menggandakan nilai XOR dengan dirinya sendiri:

var i = 12.34;
console.log('i = ' + i);
console.log('i ⊕ i ⊕ i = ' + (i ^ i ^ i));

Ini akan menampilkan:

i = 12.34
i  i  i = 12
BanksySan
sumber
2

Saya hanya menambahkan satu tambah (+) sebelum string dan itu solusinya!

+"052254" //52254

Semoga ini membantu;)

ivahidmontazer
sumber
2

Menjumlahkan penggandaan digit dengan kekuatan masing-masing sepuluh:

yaitu: 123 = 100 + 20 + 3 = 1 * 100 + 2 + 10 + 3 * 1 = 1 * (10 ^ 2) + 2 * (10 ^ 1) + 3 * (10 ^ 0)

function atoi(array) {

// use exp as (length - i), other option would be to reverse the array.
// multiply a[i] * 10^(exp) and sum

let sum = 0;

for (let i = 0; i < array.length; i++) {
    let exp = array.length-(i+1);
    let value = array[i] * Math.pow(10,exp);
    sum+=value;
}

return sum;

}

Javier Giovannini
sumber
1

function doSth(){
  var a = document.getElementById('input').value;
  document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
  return +str;
}
<input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span>

Majid Nayyeri
sumber
1

Saya menggunakan ini

String.prototype.toInt = function (returnval) { 
    var i = parseInt(this);
    return isNaN(i) ? returnval !== undefined ? returnval : - 1  :      i; 
}

dengan cara ini saya selalu mendapatkan int kembali.

Mike
sumber
1

Cara teraman untuk memastikan Anda mendapatkan bilangan bulat yang valid:

let integer = (parseInt(value, 10) || 0);

Contoh:

// Example 1 - Invalid value:
let value = null;
let integer = (parseInt(value, 10) || 0);
// => integer = 0
// Example 2 - Valid value:
let value = "1230.42";
let integer = (parseInt(value, 10) || 0);
// => integer = 1230
// Example 3 - Invalid value:
let value = () => { return 412 };
let integer = (parseInt(value, 10) || 0);
// => integer = 0
Ofir
sumber
1
function parseIntSmarter(str) {
    // ParseInt is bad because it returns 22 for "22thisendsintext"
    // Number() is returns NaN if it ends in non-numbers, but it returns 0 for empty or whitespace strings.
    return isNaN(Number(str)) ? NaN : parseInt(str, 10);
}
mhenry1384
sumber
0

Anda dapat menggunakan plus, misalnya =>

var personAge = '24'; var personAge1 = (+ personAge)

maka Anda dapat melihat typeof personAge adalah angka

elnaz nasiri
sumber