PHP memiliki intval()
fungsi yang akan mengubah string menjadi integer. Namun saya ingin memeriksa bahwa string adalah bilangan bulat sebelumnya, sehingga saya dapat memberikan pesan kesalahan yang bermanfaat kepada pengguna jika itu salah. PHP memiliki is_int()
, tetapi mengembalikan false untuk string seperti "2"
.
PHP memiliki is_numeric()
fungsi, tetapi itu akan mengembalikan true jika angkanya ganda. Saya menginginkan sesuatu yang akan mengembalikan false untuk dobel, tetapi berlaku untuk int.
misalnya:
my_is_int("2") == TRUE
my_is_int("2.1") == FALSE
Jawaban:
Bagaimana kalau menggunakan
ctype_digit
?Dari manual:
Contoh di atas akan menampilkan:
Ini hanya akan berfungsi jika input Anda selalu berupa string:
Jika input Anda mungkin bertipe
int
, maka gabungkanctype_digit
denganis_int
.Jika Anda peduli dengan angka negatif, maka Anda harus memeriksa input untuk yang sebelumnya
-
, dan jika demikian, hubungi salahctype_digit
satusubstr
dari string input. Sesuatu seperti ini akan melakukannya:sumber
ctype_digit(abs($str))
bukan hanyactype_digit
.abs('definitelynotanint') === 0
. Selain itu,ctype_digit
hanya membutuhkan stringfilter_var
harus melakukannya:tapi
Jika Anda hanya ingin Boolean sebagai nilai pengembalian, bungkus menjadi fungsi, misalnya
sumber
==
mungkin?if
3v4l.org/IAvCF+1 untuk jawaban Dominic (menggunakan
ctype_digit
). Cara lain yang bisa Anda lakukan adalah dengan paksaan tipe:sumber
is_int($inty + 0) && is_numeric($inty)
(saya tahu itu adalah solusi yang malas tetapi bekerja untuk sebagian besar maksud dan tujuan ...Keluarkan ke int. jika masih memiliki nilai yang sama intnya;
sumber
return $var == (int) $var;
Sumber .
sumber
elseif
bisa sajaif
karena Anda sudah kembali dalam pernyataan di atasnya.$data
sebuah objek, ini akan kembalinull
. Lebih baik memilikinyareturn false;
di akhir.Punya kebutuhan untuk yang kuat
is_int
baru-baru ini. Saya menemukan intval () terlalu tidak terduga:Lihat potongan ini di komentar dokumentasi PHP, dan setelah mengujinya, ia mencakup hampir semua yang Anda berikan padanya:
Tapi hati-hati:
sumber
Salah satu cara yang benar-benar bersih yang saya suka gunakan adalah yang itu. Anda melemparkannya dua kali, pertama masuk
int
, kedua masukstring
, lalu Anda membandingkan dengan ketat===
. Lihat contoh di bawah ini:Sekarang, tentang fungsi Anda my_is_int, Anda dapat melakukan sesuatu seperti ini:
sumber
sumber
'/^[-+]?[0-9]+$/'
Saya menggunakan ini:
sumber
Anda bisa saja memeriksa nomor, jika sudah mengecek daripada casting diberikan angka ganda atau tidak:
Hanya untuk angka positif:
Memeriksanya:
Keluaran:
sumber
Coba ini:
Juga berfungsi jika $ string Anda memiliki tempat desimal
sumber
Ini akan menangani angka negatif juga
sumber
sumber
Saya menemukan cara yang tidak bisa saya temukan di mana pun, jadi saya taruh di sini:
Tanpa basa-basi lagi begini:
ctype_digit((string) abs($input))
Contoh:
Hasil: (seperti yang diharapkan, saya kira)
sumber
Mungkin bukan cara yang paling baik untuk melakukannya. Tetapi Anda dapat menulisnya dalam satu baris.
Seperti yang diharapkan:
Kena kau:
sumber
Beberapa tahun terlambat, tetapi berdasarkan jawaban yang diberikan di sini saya datang dengan solusi yang sedikit lebih akurat (pada boolean, khususnya) dan lebih efisien (saya pikir) daripada kebanyakan jawaban lain:
Bekerja seperti yang diharapkan untuk ini:
Kecuali mungkin untuk 2 ini:
sumber
Bagaimana tentang:
Fungsi ini seharusnya hanya mengembalikan true untuk nomor string apa saja yang dapat dilemparkan ke int dengan
(int)
atauintval()
tanpa kehilangan sesuatu yang signifikan secara matematis (seperti non-nol setelah titik desimal atau angka di luar rentang integer PHP) sambil menerima hal-hal yang tidak signifikan secara matematis (seperti spasi putih; memimpin nol; atau, setelah titik desimal, nol secara eksklusif).Ini akan mengembalikan false untuk
'10.'
tetapi tidak untuk'10.0'
. Jika Anda ingin'10.'
menjadi benar, Anda dapat mengubah+
setelah0
dalam ekspresi reguler menjadi*
.sumber
Berikut beberapa kode yang saya gunakan yang tampaknya berfungsi dengan baik dan tidak memiliki masalah yang banyak lainnya.
Itu tidak memeriksa pesanan dll jadi tidak dimaksudkan untuk bilangan bulat negatif tetapi dengan beberapa kode tambahan yang dapat dilakukan juga menggunakan beberapa ide lain dari atas. Ini juga dapat diadaptasi untuk bekerja dengan biner
array('0', '1')
atau Hexadecimal juga dll.sumber
Lihat ini. Mengkonversi $ val ke integer dan kemudian memeriksa apakah $ val asli yang dikonversi ke string adalah IDENTICAL (===) - cukup == tidak akan berfungsi seperti yang diharapkan - ke integer val yang dikonversi ke string.
Jika Anda tidak memeriksa nilai string, itu mungkin tidak berfungsi seperti yang Anda harapkan:
Keluaran:
Alasan menjadi bahkan jika Anda menggunakan hex (0x101010), oktal (01) atau bilangan bulat yang disimpan sebagai float (1.0, 0.0), secara internal semua disimpan sebagai float. Namun, jika Anda menggunakan fungsi untuk memeriksa int disimpan sebagai string, itu akan berfungsi.
sumber
sumber
Anda dapat menggunakan kondisi berikut. Perhatikan bahwa Anda tidak boleh menggunakan! ==
sumber
Itu bekerja dengan sempurna! Semoga bermanfaat bagi Anda =)
sumber
Jika Anda ingin benar-benar tahu apakah sebuah string adalah representasi valid dari tipe integer PHP sejati ...
Namun ini tidak mungkin untuk dijalankan karena set terlalu besar (tidak akan muat dalam memori dalam kasus ini, jika Anda mengulanginya akan mengambil terlalu banyak siklus CPU).
Anda mungkin dapat melakukan pencarian biner dengan perbandingan string, namun ada cara yang lebih baik.
Yang paling sederhana:
Ada beberapa cara lain yang tidak biasa untuk mendekatinya seperti:
Anda juga dapat melakukan perbandingan string tetapi Anda masih harus melakukan hal-hal seperti ctype_digit, periksa panjangnya wajar (jangan buang-buang CPU sebelum melakukan hal-hal seperti ctype_digit) dan memiliki penanganan yang canggung untuk angka negatif.
Perhatikan bahwa filter_var tidak menyatakan dengan benar bahwa string benar-benar representasi dari integer PHP. Ini akan memungkinkan spasi + terkemuka dan sekitarnya.
PHP secara internal menggunakan fungsi "_zend_handle_numeric_str" untuk perbandingan yang ketat tetapi tidak secara langsung mengekspos ini di mana saja, karenanya trik menggunakan kunci array (yang menggunakannya untuk mengubah string apa pun yang merupakan representasi dari integer PHP ke integer PHP).
Jika Anda ingin konversi biner aman ke dan dari PHP, inilah pendekatan yang harus diambil.
Tidak semua orang mungkin menginginkannya dan itu mungkin merupakan kasus penanganan input pengguna. filter_var tidak terlalu buruk untuk itu dan akan cukup aman dalam banyak kasus untuk orang yang baru mengenal PHP.
Pemeriksaan panjang, ctype_digit dan kemudian cek nilai yang dikonversi dalam rentang juga cukup solid untuk input pengguna. Skema yang lebih kompleks mungkin ingin trim atau regex.
Masalah dengan banyak jawaban di sini dalam hal itu adalah bahwa sementara pertanyaannya tidak jelas, jawabannya tidak boleh. Jika Anda akan mengusulkan solusi, Anda harus dapat menjelaskan dengan tepat apa yang akan dan tidak diharapkan. Tanpa itu tidak ada yang tahu apakah jawaban cocok dengan pertanyaan atau aman. Manual PHP tidak selalu membantu karena tidak menjelaskan semua peringatan untuk masing-masing metode yang relevan yang disediakannya. Hal-hal seperti ctype_digit dan is_int sangat dapat diandalkan dan mudah untuk diprediksi tetapi spesifik is_numeric, filter_var dan juggling (+ $ var) atau casting (intval / floatval) kurang didokumentasikan.
Ini adalah PHP fudge untuk Anda. Ini memiliki sejumlah skema untuk menafsirkan string sebagai bilangan bulat, dengan inkonsistensi. Metode paling ketat untuk memvalidasi string integer tidak secara langsung terpapar kepada pengguna.
sumber
Jika Anda menangani ID numerik dari mysql dan mencoba untuk memaksakan validasi untuk itu menjadi bukan nol int atau
int
dalam format string ( karena mysql selalu mengembalikan semuanya dalam format string ) dan tidakNULL
. Anda dapat menggunakan yang berikut ini. Ini adalah cara bukti kesalahan / peringatan / pemberitahuan yang paling banyak untuk hanya mengizinkanint/string-ints
yang saya temukan.sumber
Inilah solusi sederhana yang menggunakan is_numeric , floatval , dan intval :
Hasil:
Perhatikan bahwa nilai yang lebih besar dari PHP_INT_MAX dapat menghasilkan false.
sumber
Bisa menggunakan is_numeric () lalu memeriksa keberadaan "." dalam string (meskipun tidak terlalu peka terhadap budaya).
Atau gunakan is_numeric () lalu gandakan ke ganda dan lihat apakah $ var == floor ($ var) (harus mengembalikan true jika itu bilangan bulat).
sumber