Bagaimana cara saya memeriksa apakah suatu variabel bilangan bulat dalam JavaScript, dan memberikan peringatan jika tidak? Saya mencoba ini, tetapi tidak berhasil:
<html>
<head>
<script type="text/javascript">
var data = 22;
alert(NaN(data));
</script>
</head>
</html>
javascript
JBa
sumber
sumber
parseInt
.Number.isInteger
yang merupakan cara paling tidak hacky.Jawaban:
Gunakan operator === ( kesetaraan ketat ) seperti di bawah ini,
sumber
2.0 === 2
karena desimal yang tidak perlu hanyalah representasi berbeda dari angka yang sama, dengan demikianparseInt(2.0) === 2.0
sama denganparseInt(2) === 2
yang benarItu tergantung, apakah Anda juga ingin menggunakan string sebagai bilangan bulat potensial juga?
Ini akan melakukan:
Dengan operasi Bitwise
Penguraian sederhana dan periksa
Hubungan arus pendek, dan menyimpan operasi parse:
Atau mungkin keduanya dalam satu kesempatan:
Tes:
Ini biola: http://jsfiddle.net/opfyrqwp/28/
Performa
Pengujian menunjukkan bahwa solusi hubungan arus pendek memiliki kinerja terbaik (ops / dtk).
Berikut ini adalah patokan: http://jsben.ch/#/htLVw
Jika Anda menginginkan hubungan arus pendek yang tumpul, tumpul:
Tentu saja, saya sarankan membiarkan minifier merawatnya.
sumber
Dengan asumsi Anda tidak tahu apa-apa tentang variabel yang dimaksud, Anda harus mengambil pendekatan ini:
Untuk membuatnya lebih sederhana:
sumber
"1.0"
adalah string, dan karenanya bukan angka. Kalau tidak,1
akan menjadi nilai variabel jika Anda menetapkannyavar my_var=1.0;
, yang diidentifikasi dengan benar oleh fungsi ini sebagai integer.Number.isInteger()
akan bekerja ... sampai saat itu, ini adalah cara yang baik untuk melakukannyaNumber.isInteger()
tampaknya menjadi cara untuk pergi.MDN juga menyediakan polyfill berikut untuk browser yang tidak mendukung
Number.isInteger()
, terutama semua versi IE.Tautan ke halaman MDN
sumber
Anda dapat memeriksa apakah nomor tersebut memiliki sisa:
Pikiran Anda, jika input Anda juga bisa berupa teks dan Anda ingin memeriksa dulu bukan, maka Anda dapat memeriksa jenisnya terlebih dahulu:
sumber
0 % 1 === 0
di konsol. Ia kembalitrue
sebagai0 % 1
pengembalian0
.0 % 1
mengembalikan0
dalam mode kompatibilitas IE9, IE8 dan IE7.Anda dapat menggunakan ekspresi reguler sederhana:
sumber
Pertama, NaN adalah "angka" (ya saya tahu itu aneh, cukup gunakan saja), dan bukan "fungsi".
Anda perlu memeriksa keduanya jika jenis variabel adalah angka, dan untuk memeriksa bilangan bulat saya akan menggunakan modulus.
sumber
(0 == 0 || 0 % 1 == 0)
akan dievaluasi untuktrue
.0 % 1 == 0
juga mengevaluasi untuktrue
!%
bukan pembagian!Hati-hati saat menggunakan
string kosong ('') atau boolean (benar atau salah) akan kembali sebagai bilangan bulat. Anda mungkin tidak ingin melakukan itu
Number.isInteger (data)
membangun fungsi di browser. Dosnt mendukung browser lama
Alternatif:
Namun, Math.round () juga akan gagal untuk string kosong dan boolean
sumber
Untuk memeriksa apakah bilangan bulat seperti poster ingin:
perhatikan + di depan data (mengkonversi string ke angka), dan === untuk tepat.
Berikut ini contohnya:
sumber
return (+data===parseInt(data))
?sumber
Solusi pre-ECMAScript-6 yang paling sederhana dan paling bersih (yang juga cukup kuat untuk mengembalikan false meskipun nilai non-numerik seperti string atau null dilewatkan ke fungsi) adalah sebagai berikut:
Solusi berikut ini juga akan berfungsi, meskipun tidak seindah yang di atas:
Perhatikan bahwa Math.ceil () atau Math.floor () dapat digunakan dengan baik (bukan Math.round ()) dalam implementasi di atas.
Atau sebagai alternatif:
Salah satu solusi salah yang cukup umum adalah sebagai berikut:
Walaupun pendekatan berbasis parseInt ini akan bekerja dengan baik untuk banyak nilai x, begitu x menjadi cukup besar, ia akan gagal berfungsi dengan baik. Masalahnya adalah parseInt () memaksa parameter pertama ke string sebelum mengurai digit. Oleh karena itu, setelah jumlahnya menjadi cukup besar, representasi stringnya akan disajikan dalam bentuk eksponensial (misalnya, 1e + 21). Karenanya, parseInt () kemudian akan mencoba mem-parse 1e + 21, tetapi akan berhenti parsing ketika mencapai karakter e dan karenanya akan mengembalikan nilai 1. Perhatikan:
sumber
Kenapa belum ada yang bilang
Number.isInteger()
?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger
Berfungsi sempurna untuk saya dan menyelesaikan masalah dengan angka
NaN
awal.sumber
Number.isInteger()
, 3,5 tahun sebelum Anda: stackoverflow.com/a/27424770/5208540Dalam ES6 2 metode baru ditambahkan untuk Number Object.
Di dalamnya metode Number.isInteger () mengembalikan true jika argumennya adalah integer.
Contoh penggunaan:
sumber
ECMA-262 6.0 (ES6) standar termasuk fungsi Number.isInteger .
Untuk menambahkan dukungan untuk browser lama, saya sangat merekomendasikan menggunakan solusi yang kuat dan didukung komunitas dari:
https://github.com/paulmillr/es6-shim
yang merupakan perpustakaan ES6 JS polyfills murni .
Perhatikan bahwa lib ini memerlukan es5-shim, cukup ikuti README.md.
sumber
Anda dapat mencoba
Number.isInteger(Number(value))
jikavalue
mungkin bilangan bulat dalam bentuk string misalnyavar value = "23"
dan Anda ingin ini dievaluasitrue
. Hindari mencobaNumber.isInteger(parseInt(value))
karena ini tidak selalu mengembalikan nilai yang benar. mis. jikavar value = "23abc"
dan Anda menggunakanparseInt
implementasi, itu masih akan mengembalikan true.Tetapi jika Anda ingin nilai integer ketat maka mungkin
Number.isInteger(value)
harus melakukan trik.sumber
sumber
Periksa apakah variabel sama dengan variabel yang sama dibulatkan ke integer, seperti ini:
sumber
true
untukNaN
, hanya dengan mengubah!=
ke!==
dan membalikif
blok. Ini berfungsi karenaNaN
merupakan satu-satunya nilai dalam JavaScript yang tidak sama dengan dirinya. Misalnya, kode baru harusif (Math.round(x) === x) { /* x IS an integer! */ }
Selain itu
Number.isInteger()
,. MungkinNumber.isSafeInteger()
ada opsi lain di sini dengan menggunakan ES6 yang ditentukan.Untuk
Number.isSafeInteger(..)
mengisi polyfill di browser pra-ES6:sumber
Number.isInteger()
adalah cara terbaik jika browser Anda mendukungnya, jika tidak, saya pikir ada banyak cara untuk melakukannya:atau:
atau:
atau:
sekarang kita dapat menguji hasilnya:
Jadi, semua metode ini berfungsi, tetapi ketika jumlahnya sangat besar, operator parseInt dan ^ tidak akan berfungsi dengan baik.
sumber
Coba saja ini:
sumber
Anda dapat menggunakan fungsi ini:
Ini akan mengembalikan true bahkan jika nilainya adalah string yang berisi nilai integer.
Jadi, hasilnya adalah:
sumber
Pendekatan saya:
a >= 1e+21
Tes hanya dapat lulus untuk nilai yang harus berupa angka dan nilai yang sangat besar. Ini akan mencakup semua kasus pasti, tidak seperti solusi lain yang telah disediakan dalam diskusi ini.a === (a|0)
Jika argumen fungsi yang diberikan tepat (===) sama dengan nilai bitwise-transformed, itu berarti bahwa argumen tersebut adalah bilangan bulat.a|0
akan kembali0
untuk nilai apa puna
yang bukan angka , dan jikaa
memang angka, itu akan menghapus apa pun setelah titik desimal, sehingga1.0001
akan menjadi1
sumber
Anda dapat menggunakan regexp untuk ini:
sumber
Dari http://www.toptal.com/javascript/interview-questions :
Menemukannya sebagai cara terbaik untuk melakukan ini.
sumber
Gunakan
|
operator:Jadi, fungsi tes mungkin terlihat seperti ini:
sumber
Ini akan menyelesaikan satu skenario lagi ( 121. ), sebuah titik di akhir
sumber
Untuk nilai integer positif tanpa pemisah:
Tes 1. jika tidak kosong dan 2. jika nilainya sama dengan hasil penggantian karakter non-digit pada nilainya.
sumber
Ok jadi minus, karena tidak menggambarkan contoh saya, jadi lebih banyak contoh :):
Saya menggunakan ekspresi reguler dan metode pengujian:
sumber
Anda juga bisa mencobanya dengan cara ini
atau
sumber
data=22.5;
. Juga kedua cabang memilikiconsole.log("not an integer")
:: SSaya harus memeriksa apakah variabel (string atau angka) adalah bilangan bulat dan saya menggunakan kondisi ini:
http://jsfiddle.net/e267369d/1/
Beberapa jawaban lain memiliki solusi yang sama (andalkan
parseFloat
digabungkan denganisNaN
), tetapi jawaban saya harus lebih mudah dan jelas.Sunting: Saya menemukan bahwa metode saya gagal untuk string yang mengandung koma (seperti "1,2") dan saya juga menyadari bahwa dalam kasus khusus saya ingin fungsi gagal jika string bukan bilangan bulat yang valid (harus gagal pada float apa pun , bahkan 1.0). Jadi inilah fungsi saya Mk II:
http://jsfiddle.net/e267369d/3/
Tentu saja jika Anda benar-benar membutuhkan fungsi untuk menerima integer floats (1.0 stuff), Anda selalu dapat menghapus kondisi titik
a.indexOf('.') == -1
.sumber