Apakah Rails 3 atau Ruby memiliki cara bawaan untuk memeriksa apakah suatu variabel bilangan bulat?
Sebagai contoh,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
ruby
ruby-on-rails-3
AnApprentice
sumber
sumber
to_i
. Itu bagian dari "mengetik bebek" Ruby: Jika itu bisa bertindak seperti bilangan bulat, perlakukan seperti itu.kind_of?
adalah alias untukis_a?
.is_a?
sedikit berbeda; ia bertanya apakah objek turunan dari kelas tertentu;kind_of?
bertanya apakah itu adalah turunan atau anak dari kelas tertentu.fido.is_a? Dog
adalah benar;fido.kind_of? Animal
benar, misalnya.Jawaban:
Anda dapat menggunakan
is_a?
metode inisumber
Integer(obj) rescue false
Ini tidak akan berfungsi untuk "1" jika Anda ingin memeriksa apakah itu akan dikonversiJika Anda ingin tahu apakah suatu objek adalah
Integer
sesuatu atau sesuatu yang dapat secara bermakna dikonversi ke Integer (TIDAK termasuk hal-hal seperti"hello"
, yangto_i
akan dikonversi menjadi0
):sumber
Integer(2.5) => 2
selalu konversi yang berarti.Gunakan ekspresi reguler pada string:
Jika Anda ingin memeriksa apakah suatu variabel berjenis tertentu, Anda cukup menggunakan
kind_of?
:sumber
\d+?
yang?
menentukan pertandingan non-serakah, sedangkan Anda mungkin ingin pertandingan opsional. Mengubah\d+?
untuk\d*
memperbaikinya, tapi saya ingin menjalankannya melalui serangkaian tes untuk memastikan. Ini juga tidak akan cocok dengan notasi hex atau eksponensial, tapi saya yakin itu bagus untuk kasus penggunaan tertentu.\A\d+\z
?Integer(obj) rescue false
kode dari @ alex-d di bawah ini; regexp sulit dibaca dan tidak jelas maksudnya. Keduanya berfungsi, saya sampai pada pertanyaan ini dalam upaya untuk memperbaiki regexp yang dibangun dengan buruk yang tidak selalu berfungsi :-)Jika Anda tidak yakin dengan jenis variabel (bisa berupa string karakter angka), katakan itu adalah nomor kartu kredit yang diteruskan ke params, jadi itu awalnya berupa string tetapi Anda ingin memastikannya tidak t memiliki karakter huruf apa pun di dalamnya, saya akan menggunakan metode ini:
@ Benny menunjukkan pengawasan terhadap metode ini, ingatlah ini:
sumber
obj.to_s == obj.to_f.to_s
seperti dalam kasus saya.Anda bisa menggunakan triple sama dengan.
sumber
Ada
var.is_a? Class
(dalam kasus Anda:)var.is_a? Integer
; yang mungkin sesuai dengan tagihan. Atau adaInteger(var)
, di mana ia akan melempar pengecualian jika tidak dapat menguraikannya.sumber
Cara yang lebih "mengetik bebek" adalah dengan menggunakan kelas
respond_to?
"seperti integer" atau "string-like" ini juga dapat digunakansumber
Jika Anda tidak perlu mengkonversi nilai nol, saya menemukan metode
to_i
danto_f
menjadi sangat berguna karena mereka akan mengkonversi string ke nilai nol (jika tidak dapat dikonversi atau nol) atau nilai aktualInteger
atauFloat
.EDIT2: hati-hati, nilai
0
integer bukan falsey itu benar (!!0 #=> true
) (terima kasih @prettycoder)EDIT
Ah baru tahu tentang kasing hitam ... sepertinya hanya terjadi jika angkanya ada di posisi pertama
sumber
Untuk memanfaatkan jawaban Alex D , gunakan penyempurnaan :
Kemudian, di kelas Anda:
sumber
Saya memiliki masalah yang sama sebelum mencoba untuk menentukan apakah ada sesuatu yang berupa string atau nomor apa pun. Saya telah mencoba menggunakan ekspresi reguler, tetapi itu tidak dapat diandalkan untuk kasus penggunaan saya. Sebagai gantinya, Anda dapat memeriksa kelas variabel untuk melihat apakah itu adalah turunan dari kelas Numerik.
Dalam situasi ini, Anda juga bisa menggantikan keturunan Numeric: BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rasional, Kompleks
sumber
Mungkin Anda mencari sesuatu seperti ini:
Terima "2.0 atau 2.0 sebagai INT tetapi tolak 2.1 dan" 2.1 "
sumber