Saya berharap ada sesuatu dalam ruang konseptual yang sama dengan IsNumeric()
fungsi VB6 lama ?
javascript
validation
numeric
Electrons_Ahoy
sumber
sumber
isNaN("")
,isNaN(" ")
,isNaN(false)
, dll pengembalianfalse
untuk ini, menyiratkan bahwa mereka adalah nomor.Jawaban:
Untuk memeriksa apakah variabel (termasuk string) adalah angka, periksa apakah itu bukan angka:
Ini berfungsi terlepas dari apakah konten variabel adalah string atau angka.
Contohnya
Tentu saja, Anda dapat meniadakan hal ini jika perlu. Misalnya, untuk menerapkan
IsNumeric
contoh yang Anda berikan:Untuk mengonversi string yang berisi angka menjadi angka:
Hanya berfungsi jika string hanya berisi karakter numerik, jika tidak maka string akan kembali
NaN
.Contohnya
Untuk mengkonversi string secara longgar ke angka
Berguna untuk mengubah '12px' menjadi 12, misalnya:
Contohnya
Mengapung
Ingatlah bahwa, tidak seperti
+num
,parseInt
(seperti namanya) akan mengubah float menjadi integer dengan memangkas semua yang mengikuti titik desimal (jika Anda ingin menggunakanparseInt()
karena perilaku ini, Anda mungkin lebih baik menggunakan metode lain sebagai gantinya ) :String kosong
String kosong mungkin sedikit kontra-intuitif.
+num
mengonversi string kosong atau string dengan spasi menjadi nol, danisNaN()
mengasumsikan yang sama:Tetapi
parseInt()
tidak setuju:sumber
isNaN
"Untuk memeriksa apakah suatu variabel bukan angka". "bukan angka" tidak sama dengan "IEEE-794 NaN", yang merupakanisNaN
ujian. Secara khusus, penggunaan ini gagal saat menguji boolean dan string kosong, setidaknya. Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .var n = 'a'; if (+n === +n) { // is number }
Ini ~ 3994% lebih cepat daripada isNaN di versi terbaru Chrome. Lihat tes kinerja di sini: jsperf.com/isnan-vs-typeof/5isNaN(1 + false + parseInt("1.do you trust your users?"))
Dan Anda bisa menggunakan cara RegExp:
sumber
Jika Anda hanya mencoba memeriksa apakah string adalah bilangan bulat (tidak ada tempat desimal), regex adalah cara yang baik untuk dilakukan. Metode lain seperti
isNaN
terlalu rumit untuk sesuatu yang sangat sederhana.Untuk hanya mengizinkan bilangan bulat positif gunakan ini:
sumber
/^-?\d+$/
Baik?Jika Anda benar-benar ingin memastikan bahwa string hanya berisi nomor, nomor apapun (integer atau floating point), dan tepat jumlah, Anda tidak dapat menggunakan
parseInt()
/parseFloat()
,Number()
atau!isNaN()
sendiri. Perhatikan bahwa!isNaN()
sebenarnya kembalitrue
kapanNumber()
akan mengembalikan nomor, danfalse
kapan akan kembaliNaN
, jadi saya akan mengecualikannya dari sisa diskusi.Masalahnya
parseFloat()
adalah bahwa ia akan mengembalikan angka jika string berisi angka apa pun, bahkan jika string tidak hanya berisi dan persis angka:Masalahnya
Number()
adalah bahwa ia akan mengembalikan angka jika nilai yang diteruskan bukan angka sama sekali!Masalah dengan menggulirkan regex Anda sendiri adalah bahwa kecuali Anda membuat regex yang tepat untuk mencocokkan nomor floating point karena Javascript mengenalinya, Anda akan kehilangan case atau mengenali case di mana Anda seharusnya tidak. Dan bahkan jika Anda dapat memutar regex Anda sendiri, mengapa? Ada cara bawaan yang lebih sederhana untuk melakukannya.
Namun, ternyata
Number()
(danisNaN()
) melakukan hal yang benar untuk setiap kasus di manaparseFloat()
mengembalikan angka ketika seharusnya tidak, dan sebaliknya. Jadi untuk mengetahui apakah string benar-benar tepat dan hanya sebuah angka, panggil kedua fungsi dan lihat apakah keduanya mengembalikan true:sumber
' 1'
,'2 '
dan' 3 '
semuanya kembali benar.isNumber
fungsi tidak berurusan dengan antarmuka pengguna. Juga, input angka yang baik tidak akan memungkinkan spasi untuk memulai.Jawaban yang diterima untuk pertanyaan ini memiliki beberapa kelemahan (seperti disorot oleh beberapa pengguna lain). Ini adalah salah satu cara termudah & terbukti untuk mendekatinya dalam javascript:
Berikut adalah beberapa kasus pengujian yang baik:
sumber
Coba fungsi isNan :
sumber
isNaN()
kembalifalse
untuk string APAPUN yang hanya berisi karakter spasi putih, termasuk hal-hal seperti '\ u00A0'.Pertanyaan lama, tetapi ada beberapa poin yang hilang dalam jawaban yang diberikan.
Notasi ilmiah.
!isNaN('1e+30')
adalahtrue
, namun dalam sebagian besar kasus ketika orang meminta nomor, mereka tidak ingin mencocokkan hal-hal seperti1e+30
.Angka mengambang besar mungkin berperilaku aneh
Amati (menggunakan Node.js):
Di samping itu:
Jadi, jika seseorang mengharapkan
String(Number(s)) === s
, maka lebih baik batasi string Anda paling banyak 15 digit (setelah menghilangkan angka nol di depan).Infinity
Mengingat semua itu, memeriksa bahwa string yang diberikan adalah angka yang memuaskan semua hal berikut:
Number
dan kembali keString
bukanlah tugas yang mudah. Ini adalah versi sederhana:
Namun, bahkan yang satu ini masih jauh dari lengkap. Nol pengarah tidak ditangani di sini, tetapi mereka mengacaukan uji panjang.
sumber
Saya telah menguji dan solusi Michael adalah yang terbaik. Pilih jawabannya di atas (cari halaman ini untuk "Jika Anda benar-benar ingin memastikan bahwa sebuah string" dapat menemukannya). Intinya, jawabannya adalah ini:
Ini berfungsi untuk setiap test case, yang saya dokumentasikan di sini: https://jsfiddle.net/wggehvp9/5/
Banyak solusi lain gagal untuk kasus tepi ini: '', null, "", true, dan []. Secara teori, Anda bisa menggunakannya, dengan penanganan kesalahan yang tepat, misalnya:
atau
dengan penanganan khusus untuk / \ s /, null, "", true, false, [] (dan lainnya?)
sumber
Anda bisa menggunakan hasil dari Number ketika meneruskan argumen ke konstruktornya.
Jika argumen (string) tidak dapat dikonversi menjadi angka, ia mengembalikan NaN, jadi Anda dapat menentukan apakah string yang diberikan adalah angka yang valid atau tidak.
Catatan: Catatan saat meneruskan string kosong atau
'\t\t'
dan'\n\t'
sebagai Angka akan mengembalikan 0; Passing true akan mengembalikan 1 dan pengembalian salah 0.sumber
Number
konstruktor adalah persis sama dengan+x
.Number()
menangani angka float juga, sepertiNumber.parseFloat()
tidakNumber.parseInt()
Mungkin ada satu atau dua orang yang menjawab pertanyaan ini yang membutuhkan pemeriksaan lebih ketat dari biasanya (seperti yang saya lakukan). Dalam hal ini, ini mungkin berguna:
Waspadalah! Ini akan menolak string seperti
.1
,40.000
,080
,00.1
. Ini sangat pemilih - string harus cocok dengan " bentuk paling sempurna minimal " dari angka untuk lulus tes ini.Ini menggunakan
String
danNumber
konstruktor untuk melemparkan string ke nomor dan kembali lagi dan dengan demikian memeriksa apakah "bentuk minimal sempurna" mesin JavaScript (yang itu dikonversi denganNumber
konstruktor awal ) cocok dengan string asli.sumber
(str === String(Math.round(Number(str))))
."Infinity"
,"-Infinity"
, dan"NaN"
lulus tes ini. Namun, ini bisa diperbaiki menggunakanNumber.isFinite
tes tambahan .str === ("" + +str)
. Ini pada dasarnya memeriksa apakah string adalah hasil dari pengetatan nomor JS. Mengetahui hal ini, kita juga dapat melihat masalah: tes lulus0.000001
tetapi gagal0.0000001
, yaitu saat1e-7
lulus. Sama untuk angka yang sangat besar.parseInt (), tetapi perlu diketahui bahwa fungsi ini sedikit berbeda dalam arti bahwa itu misalnya mengembalikan 100 untuk parseInt ("100px").
sumber
parseInt(09)
.paraseInt(09, 10)
, 10
berdebat.parseInt('09')
sekarang sama dengan 9.Mengutip:
tidak sepenuhnya benar jika Anda perlu memeriksa ruang depan / belakang - misalnya ketika diperlukan jumlah digit tertentu, dan Anda perlu mendapatkan, katakan, '1111' dan bukan '111' atau '111' untuk kemungkinan PIN memasukkan.
Lebih baik digunakan:
sumber
'-1'
,'0.1'
dan'1e10'
semuanya mengembalikan false. Lebih jauh lagi, nilai yang lebih besar dari infinity positif atau lebih kecil dari infinity negatif mengembalikan true, sementara mereka mungkin harus mengembalikan falseMengapa implementasi jQuery tidak cukup baik?
Michael menyarankan sesuatu seperti ini (meskipun saya telah mencuri "user1691651 - versi John yang diubah di sini):
Berikut ini adalah solusi dengan kemungkinan besar kinerja buruk, tetapi hasil yang solid. Ini adalah alat yang dibuat dari implementasi jQuery 1.12.4 dan jawaban Michael, dengan pemeriksaan tambahan untuk spasi awal / akhir (karena versi Michael mengembalikan true untuk angka dengan spasi awalan / spasi tambahan):
Versi terakhir memiliki dua variabel baru. Seseorang dapat menyiasati salah satu dari itu, dengan melakukan:
Saya belum menguji salah satu dari ini sangat banyak, dengan cara lain selain secara manual menguji beberapa kasus penggunaan saya akan memukul dengan kesulitan saya saat ini, yang semuanya sangat standar. Ini adalah situasi "berdiri di pundak-raksasa".
sumber
Ini tidak valid untuk TypeScript karena:
declare function isNaN(number: number): boolean;
Untuk TypeScript Anda dapat menggunakan:
/^\d+$/.test(key)
sumber
Yah, saya menggunakan yang ini saya buat ...
Sejauh ini sudah berfungsi:
Jika Anda menemukan masalah dengan itu, tolong beri tahu saya.
sumber
return !isNaN(parseInt(value, 10));
Jika ada yang pernah sampai sejauh ini, saya menghabiskan waktu meretas ini mencoba menambal moment.js ( https://github.com/moment/moment ). Berikut adalah sesuatu yang saya ambil dari itu:
Menangani kasus-kasus berikut:
Benar! :
Salah! :
Ironisnya, yang paling sulit saya perjuangkan:
Ada saran yang diterima. :]
sumber
isNumeric(' ')
danisNumeric('')
?&& (val.replace(/\s/g,'') !== '') //Empty && (val.slice(-1) !== '.') //Decimal without Number
untuk mengatasi masalah yang disebutkan di atas dan satu saya sendiri.Menggunakan JavaScript biasa:
Menggunakan Lodash:
sumber
sumber
2019: Termasuk Contoh ES3, ES6 dan TypeScript
Mungkin ini telah berulang kali diulangi, namun saya bertarung dengan yang ini hari ini juga dan ingin memposting jawaban saya, karena saya tidak melihat jawaban lain yang melakukannya secara sederhana atau menyeluruh:
ES3
ES6
Naskah
Ini tampaknya cukup sederhana dan mencakup semua pangkalan yang saya lihat di banyak posting lain dan berpikir sendiri:
Anda juga dapat mencoba sendiri
isNumeric
fungsi dan hanya melewati dalam kasus penggunaan ini dan memindai "benar" untuk semuanya.Atau, untuk melihat nilai yang dikembalikan masing-masing:
sumber
2019: Pemeriksaan validitas numerik yang praktis dan ketat
Seringkali, 'angka valid' berarti nomor Javascript tidak termasuk NaN dan Infinity, yaitu 'angka terbatas'.
Untuk memeriksa validitas numerik suatu nilai (dari sumber eksternal misalnya), Anda dapat mendefinisikan dalam gaya ESlint Airbnb:
dan gunakan seperti ini:
sumber
PFB solusi kerja:
sumber
Selamatkan diri Anda dari sakit kepala karena mencoba menemukan solusi "bawaan".
Tidak ada jawaban yang baik, dan jawaban yang sangat bagus di utas ini salah.
npm install is-number
sumber
Saya baru-baru ini menulis sebuah artikel tentang cara untuk memastikan variabel adalah angka yang valid: https://github.com/jehugaleahsa/artifacts/blob/master/2018/typescript_num_hack.md Artikel ini menjelaskan cara memastikan floating point atau integer, jika itu penting (
+x
vs~~x
).Artikel ini mengasumsikan variabelnya adalah a
string
atau anumber
sebagai permulaan dantrim
tersedia / polyfilled. Tidak akan sulit untuk memperpanjangnya untuk menangani tipe lain, juga. Inilah dagingnya:sumber
Usaha saya sedikit membingungkan, Mungkin bukan solusi terbaik
sumber
042
) dan heksadesimal (0x45f
)Dalam aplikasi saya, kami hanya mengizinkan az AZ dan 0-9 karakter. Saya menemukan jawaban di atas menggunakan " string % 1 === 0" berfungsi kecuali string dimulai dengan 0xnn (seperti 0x10) dan kemudian akan mengembalikannya sebagai numerik ketika kami tidak menginginkannya. Perangkap sederhana berikut ini dalam pemeriksaan numerik saya tampaknya berhasil dalam kasus-kasus khusus kami.
Peringatan : Ini mungkin mengeksploitasi bug lama dalam Javascript dan Actionscript [Number ("1" + the_string)% 1 === 0)], saya tidak bisa berbicara untuk itu, tetapi itulah yang kami butuhkan.
sumber
% 1
operasi numerik pada mereka), dan itu akan menafsirkan string sebagai hex atau float literal.Solusi saya:
Anda dapat menambahkan kondisi tambahan di dalam loop, agar sesuai dengan kebutuhan khusus Anda.
sumber
Anda dapat menggunakan tipe, seperti dengan aliran librar y, untuk mendapatkan statis, kompilasi waktu memeriksa. Tentu saja tidak terlalu berguna untuk input pengguna.
sumber
Berikut ini adalah satu-liner untuk memeriksa apakah
sNum
nilai numerik yang valid; telah diuji untuk berbagai macam input:sumber
Cukup gunakan
isNaN()
, ini akan mengonversi string ke angka dan jika mendapatkan nomor yang valid , akan kembalifalse
...sumber
Saya menggunakan yang berikut ini:
sumber
1..1
,1,1
,-32.1.12
, dan yang lebih penting gagalundefined
danNaN
. Jika Anda lulusundefined
atauNaN
itu akan mengembalikan Anda positif palsu mengatakan itu nomor.