Maklumat

Tulisan-tulisan terkini dapat juga didapatkan di halaman Kompasiana di alamat https://kompasiana.com/didikaha

Khusus untuk konten-konten sastra seperti puisi, cerpen dan esai silahkan kunjungi http://blog.edelweis-art.com. Terima kasih (Penulis)

Sabtu, Mei 09, 2015

Cara Mengambil Angka dari Sebuah String pada PHP & MySQL

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.