Baik pada PHP maupun MySQL, telah disediakan function untuk mengambil atau mengekstrak angka dari sebuah string. Pada PHP, antara lain kita bisa menggunakan function intval() dan floatval(), sementara pada MySQL kita bisa menggunakan function convert(). Contoh penggunaannya yaitu:
// PHP $teks1 = "12 buah"; $angka1 = intval($teks1); // hasilnya 12 $teks2 = "2.5%"; $angka2 = floatval($teks2); // hasilnya 2.5 // MySQL SELECT CONVERT('24 ons', SIGNED); # hasilnya 24
Namun demikian, baik function intval() dan floatval() pada PHP maupun convert() pada MySQL, hanya dapat diterapkan jika posisi angka berada di bagian awal string. Jika posisi angka tidak berada di awal string, akan menghasilkan 0. Contoh:
// PHP $teks3 = "pukul 14"; $angka3 = intval($teks3); // hasilnya 0 $teks4 = "km 2.3"; $angka4 = floatval($teks4); // hasilnya 0 // MySQL SELECT CONVERT('F12', SIGNED); # hasilnya 0
Toh, untuk kasus yang sederhana, yaitu di mana komposisi string sudah kita ketahui, misalnya bagian yang bukan angka hanya "Rp ", atau angka selalu dimulai pada urutan ke-4 pada string, kita masih bisa mengakalinya, yaitu dengan cara membuang bagian yang bukan angka dengan menggunakan function str_replace() atau substr_replace() pada PHP atau function replace() pada MySQL, yang seringkali juga dipadukan dengan fungsi trim(), ltrim() ataupun rtrim(). Misalnya:
// PHP // mengambil angka pada string uang yang disertai dengan "Rp" $teks5 = "Rp 3500"; $angka5 = str_replace("Rp","",$teks5); // hasilnya " 3500" $angka5 = ltrim($angka5); // sekarang menjadi "3500" $teks6 = "12750 Rp"; $angka6 = rtrim(str_replace("Rp","",$teks6)); // hasilnya "12750" // mengambil angka pada string alphanumeric yang berada di bagian tengah diapit masing-masing 2 huruf $teks7 = "ab1123cd"; $angka7 = substr_replace(substr_replace($teks7,"",0,2),"",-2); // hasilnya 1123 $teks8 = "fc101074ae"; $angka8 = substr_replace(substr_replace($teks8,"",0,2),"",-2); // hasilnya 101074 // MySQL SELECT TRIM(REPLACE('nomor 28', 'nomor', '')); # hasilnya 28
Selain function-function di atas, masih terdapat pula beberapa function lain yang bisa digunakan untuk mengekstrak angka dari sebuah string seperti substr() dan substring() pada PHP ataupun substring() dan substring_index() pada MySQL. Namun, semua function tersebut hanya berlaku jika kita telah mengetahui komposisi stringnya. Lalu, bagaimana halnya jika kita tidak dapat memastikan komposisi stringnya? Misalnya huruf apa sajakah yang menyertai angka pada string tersebut, atau apakah angkanya berurutan atau tidak, atau apakah selain huruf ada karakter-karakter lainnya yang menyertai angka pada string atau tidak.
Pada PHP, untuk string yang acak, kita bisa menggunakan bantuan regular expresion untuk membuat rumusan yang bisa berlaku umum untuk mengekstrak angka dari sebuah string. Misalnya kita ingin mengambil angka dari string 'rumah nomor 35 di jalan merdeka' dan 'ab72dw5d659s3', kita bisa melakukannya dengan menggunakan function preg_replace(), yaitu:
// PHP $pattern = '/([^0-9]+)/'; $teks1 = 'rumah nomor 35 di jalan merdeka'; $angka1 = preg_replace($pattern,'',$teks1); // hasilnya 35 $teks2 = 'ab72dw5d659s3'; $angka2 = preg_replace($pattern,'',$teks2); // hasilnya 7256593
Sayangnya, pada MySQL, meski tersedia pula function regular expresion untuk string, namun itu hanya berfungsi untuk pencarian saja, yaitu regexp. Karenanya, kita mesti menentukan atau membuat sendiri function yang akan kita gunakan untuk mengekstrak angka dari sebuah string.
Berikut adalah sebuah function yang bisa digunakan untuk mengekstrak angka dari sebuah string. Function ini saya ambil dari forum yang membahas hal yang sama. Function ini telah saya kembangkan agar bisa dipergunakan pada komposisi string yang lebih kompleks.
DELIMITER // DROP FUNCTION IF EXISTS GET_NUMBER // CREATE FUNCTION GET_NUMBER(input VARCHAR(255)) RETURNS VARCHAR(255) BEGIN DECLARE output VARCHAR(255) DEFAULT ''; DECLARE iterator INT DEFAULT 1; WHILE iterator < (LENGTH(input) + 1) DO IF SUBSTRING(input, iterator, 1) IN ('.', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-') THEN SET output = CONCAT(output, SUBSTRING(input, iterator, 1)); END IF; SET iterator = iterator + 1; END WHILE; WHILE (SUBSTRING(output, -1) = '.') OR ((SUBSTRING(output, -1) = '0') AND (SUBSTRING(output, 1, LENGTH(output) - 1) LIKE '%.%')) DO SET output = SUBSTRING(output, 1, LENGTH(output) - 1); END WHILE; WHILE SUBSTRING(output, 1, 1) = '0' DO SET output = SUBSTRING(output, 2); END WHILE; WHILE SUBSTRING(output, 1, 2) = '-0' DO SET output = CONCAT('-', SUBSTRING(output, 3)); END WHILE; IF REPLACE(REPLACE(REPLACE(output, '.', ''), '0', ''), '-', '') = '' THEN SET output = ''; ELSEIF (LENGTH(output) - LENGTH(REPLACE(output, '.', ''))) > 1 THEN SET output = REPLACE(output, '.', ''); ELSEIF (((LENGTH(output) - LENGTH(REPLACE(output, '-', ''))) = 1) AND (SUBSTRING(output, 1, 1) <> '-')) OR ((LENGTH(output) - LENGTH(REPLACE(output, '-', ''))) > 1) THEN SET output = REPLACE(output, '-', ''); END IF; IF SUBSTRING(output, 1, 1) = '.' THEN SET output = CONCAT('0', output); ELSEIF SUBSTRING(output, 1, 2) = '-.' THEN SET output = CONCAT('-0', SUBSTRING(output, 2)); ELSEIF output = '' THEN SET output = '0'; END IF; RETURN output; END // DELIMITER ; # contoh penggunaan: SELECT GET_NUMBER('asdf275$$s43::21'); # hasilnya 2754321 SELECT GET_NUMBER('ukuran 17.2 inci'); # hasilnya 17.2 SELECT GET_NUMBER('-def000.15ds00'); # hasilnya -0.15 SELECT GET_NUMBER('.75kg'); # hasilnya 0.75
Demikian, semoga bermanfaat.
Tidak ada komentar:
Posting Komentar