Mengubah Format Currency dan Format Rupiah ke dalam Number pada Bahasa Java

Berawal dari lebih dari 1 orang yang nanyain di kotak komentar postingan ini, gw akhirnya bikin dah post ini. Mayan… buat nambah2in isi blog yang agak guna biar ga curcolan mulu isinya…

Singkat cerita, ada yang nanyain gimana cara ngubah format dalam bentuk duit balik lagi ke sifat aslinya (number) biar bisa dioperasiin. Well… buat gw, itu pertanyaan yang bikin gw bingung. Banget! Karena… faktanya, kalau kamu udah punya suatu “a” yang kamu ubah jadi “b”, buat apa kamu ngubah “b” jadi “a”. Toh nilai “a” dari awal udah kamu punya dan nilainya sama sekali ga ketimpa. Beda tipe data gitu… gimana cara isinya bisa ditimpa jadi nilai lain kan yah… Makanya gw bingung.

Tapi apapun itu… ada satu alasan buat para programmer-pemberi-isi-kotak-komentar-di-postingan-asal biar ga ambil lagi nilai awalnya. Dan mereka bingung gimana cara balikinnya. Untuk itu… disinilah gw sebagai pencerah bagi mereka yang kebingungan… Hohoho.

Seperti yang gw tulisin di kotak balasan, ada beberapa langkah yang musti dilakukan:

  1. Parse formatted String ke tipe Number pakai method parse dari objekDecimalFormat
  2. Konversi bentuk Number ke byte/double/float/long/int/short pakai byteValue/doubleValue dst.

Simple kan… buat yang bingung, kodenya gini:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

public class KurensiIndonesia {

    public static void main(String[] args) {
        double harga = 250000000;

        DecimalFormat kursIndonesia = (DecimalFormat) DecimalFormat.getCurrencyInstance();
        DecimalFormatSymbols formatRp = new DecimalFormatSymbols();

        formatRp.setCurrencySymbol("Rp. ");
        formatRp.setMonetaryDecimalSeparator(',');
        formatRp.setGroupingSeparator('.');

        kursIndonesia.setDecimalFormatSymbols(formatRp);
        String x = kursIndonesia.format(harga);
        System.out.println("Harga Rupiah: "+x);
//konversi balik String --> number type
        try {
            Number number = kursIndonesia.parse(x);
            double nilai = number.doubleValue();
            System.out.println("Nilai dari rupiah: "+String.format("%.2f", nilai));
        } catch (ParseException ex) {
            System.out.println("Kesalahan Parsing");
        }
    }
}

Hasil:

Capture

Contoh kode yang lebih singkat… cuma buat konversi rupiah ke angka itu gini:

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;

public class KurensiIndonesia {

    public static void main(String[] args) {

        String x = "Rp. 250.000.000,00";
        DecimalFormat kursIndonesia = (DecimalFormat) DecimalFormat.getCurrencyInstance();
        DecimalFormatSymbols formatRp = new DecimalFormatSymbols();

        formatRp.setCurrencySymbol("Rp. ");
        formatRp.setMonetaryDecimalSeparator(',');
        formatRp.setGroupingSeparator('.');

        kursIndonesia.setDecimalFormatSymbols(formatRp);
        try {
            Number number = kursIndonesia.parse(x);
            double nilai = number.doubleValue();
            System.out.println("Nilai dari rupiah: "+String.format("%.2f", nilai));
        } catch (ParseException ex) {
            System.out.println("Kesalahan Parsing");
        }
    }
}

Intinya, pastiin objek DecimalFormat sama DecimalFormatSymbols yang dibentuk itu sama jenisnya. Gampangnya, objek yang digunain buat nge-format sama nge-parse itu sama. Jangan sampe beda. Kalau beda, ada kemungkinan kamu dapat nilai yang salah bahkan kegagalan eksepsi.

Dan karena banyak yang nanya juga terkait swing dan lainnya… hal di atas gw juga udah coba ke swing (pakai jtextfield biasa) sama akses database (nyimpen ke Access–biar gw ga usah nginstall dbms lagi)…. dan berhasil.

Moga ngebantu urusan kamu masing-masing…

Baca juga: Mengubah nilai double –> rupiah.

Pass By Reference Menggunakan Java

Okeh… ini postingan yang bermula dari chat yang dah lamaaaaaaa banget. Tapi baru sempat gw bikin tulisannya sekarang. Yeah… shame on me… 😦

Kerjaan seabrek emang mustinya gak jadi alasan. Gw ajah yang ga bisa ngatur jadwal. Tapi yah.. gitu deh, akhirnya ketulisan juga nih blog pake postingan yang sebenernya dah kadaluarsa.

Jadi… yaaa, ada lah yaaa… kenalan gw. Sebut saja si Cantik (karena ga mau disebutin identitasnya). Ceritanya si Cantik ini keukeuh ama temennya kalo yang namanya pass by reference itu mungkin banget ditulisin pake bahasa Java. Dan pendiriannya itu tepat! Sayangnya, contoh implementasi (berdasarkan pengakuan) yang dia kasih… ternyata ga secantik…. nama aliasnya (yah… nama aliasnya si Cantik, kan?).

Key… jadi… di Java emang mungkin untuk membuat sebuah mekanisme pass-by-reference layaknya bahasa pemrograman C++. Cuma caranya ajah yang beda. Kalo di C++, kan pake pengaksesan alamat menggunakan simbol ampersand (&). Sedangkan kalo di Java, cara pengaksesannya menggunakan pengiriman objek. Yah… kalo ada dari kamu yang nganggap ini bukan sebagai bentuk pass by reference, gw juga gak ngebantah. Emang sifatnya agak beda. Tapi gw punya alasan yang cukup buat berpegang teguh kenapa pengiriman objek jadi mirip sama pass by reference.

Cukup ngocehnya, jadi berikut contoh dari kode pass by value plus pass by reference make bahasa pemrograman Java.

public class X {

    int u,v;

    public X(int u, int v) {
        this.u = u;
        this.v = v;
    }

    public void passValue(int u, int v){
        u = u+10;
        v = v*10;
    }

    public void passReference(X x){
        x.u = x.u+10;
        x.v = x.v*10;
    }
}
public class Main {
public static void main(String[] args) {
X x = new X(1,2);

//Nilai u & v milik objek x sebelum pass by value
System.out.println("Pass Value\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passValue(x.u, x.v);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

//Nilai u & v milik objek x sebelum pass by reference
System.out.println("\nPass Reference\nNilai Sebelum Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);
//pemanggilan pass by value
x.passReference(x);

System.out.println("\nNilai Setelah Pass");
System.out.println("U: "+x.u);
System.out.println("V: "+x.v);

}
}

Jadi skenario dari kode di atas, terdapat sebuah class X. Class tersebut mempunyai 2 buah fungsi (passValue untuk merepresentasikan pass by value, dan passReference untuk pass by reference). Kedua fungsi tersebut dimaksudkan untuk mengubah isi dari atribut yang dimiliki. Dan terlihat, bahwa hasil akhirnya sebagai berikut:

Pass By Reference

Terdapat perubahan nilai ketika dilakukan skenario pass by reference. Hal yang perlu diperhatikan di sini, pass by reference di Java hanya mungkin untuk dilakukan oleh pengiriman objek, dan tidak mungkin dilakukan jika menggunakan pengiriman menggunakan tipe data primitif.

Buat nambahin… gw kasih liat kalo yang namanya objek itu merupakan sebuah referensi. Hal ini yang bikin skenario di atas jadi kayak pass by reference, padahal yang diubah cuma nilai objeknya (yah…. kode di atas bisa didebat tentang pass2an itu). Jadi… gw punya skenario kode pembentukan objek dari class X yang ditulisin gini:

public class NewClass1 {
    public static void main(String[] args) {
        X x = new X(10,20);
        X y = new X(30,40);
        System.out.println("Nilai Awal");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

        //operasi penyamaan referensi
        x = y;

        System.out.println("\nNilai Setelah Operasi x = y");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+
    }
}

Hasilnya gini:

Hasil Perubahan x=y

Kalo kamu liat2, hasilnya wajar lah ya…. Kalo x = y, maka nilai x akan ngikutin nilai y. Juga kalau ada perubahan nilai y, maka nilai x otomatis akan berubah. Wajar! Tapi… coba dibalik… kalo seandainya ada skenario gini…

        x.u=1;
        x.v=2;

        System.out.println("\nNilai Setelah Operasi Perubahan x");
        System.out.println("Nilai x.u: "+x.u);
        System.out.println("Nilai y.u: "+y.u);
        System.out.println("Nilai x.v: "+x.v);
        System.out.println("Nilai y.v: "+y.v);

Hasilnya bakal gini…

Nilai Perubahan X

Liat kan… kalau ada perubahan di x, ternyata nilai y juga berubah. Hal ini terjadi karena pas dilakukan operasi “x=y”, yang dilakukan si javanya, ga cuma sekedar ngubah nilai. Tapi juga penyamaan alamat. Kalo kamu masih ga percaya, coba ajah debug, lihat posisi penyimpanan masing-masing objek sebelum dan sesudah operasi “x=y”.

Begitulah… intinya, kamu bisa ngelakuin pass by reference dengan cara ngakses objek dari class terkait… dan hal yang sama gak akan kamu dapatkan dengan ngakses variabel dengan tipe data primitif biasa.

Walo penjelasannya belepotan, moga ngebantu yah… terutama buat si *******… eh, si Cantik… 😀

Menyimpan Objek Java ke dalam File

Minnaaaa~~~, akhirnya blog balita balik lagi. Sekarang, bakal dibahas caranya gimana buat nyimpan data dalam bentuk objek. Yap, emang kalo nyimpan data gampangnya pake database ajah. Tapi, dalam satu atau lain kesempatan, bisa ajah kita musti nyimpen bukan ke database, tapi bentuk lain. Kalo udah gini, cara paling gampang yaaa… pake penyimpanan file. Tapi, akses file sendiri biasanya yang disimpan adalah tulisan2.

Tulisan ini bisa aja dijadiin data tersendiri ke dalam file kalo ngegunain pake bahasa pemrograman Java. Tapi, pendekatan yang gw maksud gini… Pas kamu punya satu master data yang jumlahnya puluhan baris record, dan satu record-nya terdiri dari beberapa hal. Yaa.. contohnya aja kamu nyimpen data semua member JKT48 di aplikasi yang kamu bikin. Kali ajah, kan… Dan hal ini, gak bisa kamu simpan gitu aja dalam bentuk tulisan. Karena, kamu musti bikin parsing dari tulisan2 yang kamu simpan. Alternatif penyimpanan yang bisa kamu lakuin contohnya (paling gak yang kepikiran ma gw sekarang), yaitu nyimpen dalam format XML. Yap, kamu musti parsing lagi, tapi bentuknya kan dah standar. Jadi gampang… dan alternatif lainnya, merupakan hal yang bakal dibahas di postingan sekarang… yaitu nyimpen dalam bentuk objek.

Bahasa Java mengakomodir penyimpanan objek yang dibentuk ke dalam file. Untuk melakukan hal ini, kita butuh yang namanya package java.io. Bagian yang kita butuhkan nantinya yaitu “FileOutputStream” dan “ObjectOutputStream”. Dari namanya ajah dah jelas ya gunanya buat apa. Selain itu, yang kita butuhin juga, bentuk POJO dari class yang kita simpan objeknya. Gw agak gak yakin tentang POJO (yaaa, maaf2 ajah kalo gw salah ngejerumusin kamu semua ama info yang gak valid. Kalo ada yang musti diperbaikin tell2 yak), tapi intinya POJO itu kependekan dari “Plain Old Java Object”. Bentuk dari POJO itu standar… cuma satu class dengan atribut dan method set-get, ditambah meng-implements “Serializable” dari java.io.Serializable.

Okeh, kita langsung praktek yah… Pertama, bikin class POJO dari objek yang nantinya mau disimpen. Gw bikin class “Oshi”, dengan atribut nama, tim, plus tahun lahir. Konstruktornya mau ada ketiga-tiganya, trus override method toString jugak. Jadi, gw bikin 1 file java, dengan class diagram kayak gini:

Class Diagram Oshi

Class diagram di atas dibikin pake plugin EasyUML dari Netbeans, gak bikin sendiri. Jadi kalo dirasa gak sesuai ama UML yang kamu kenal, yaaa… silahkan disesuaikan ajah. Kode dari class diagram di atas ditulisin gini:

import java.io.Serializable;

/**
 *
 * @author arby
 */

public class Oshi implements Serializable{
    private String nama;
    private char tim;
    private int tahunLahir;

    public Oshi(String nama, char tim, int tahunLahir) {
        this.nama = nama;
        this.tim = tim;
        this.tahunLahir = tahunLahir;
    }

    public String getNama() {
        return nama;
    }

    public void setNama(String nama) {
        this.nama = nama;
    }

    public char getTim() {
        return tim;
    }

    public void setTim(char tim) {
        this.tim = tim;
    }

    public int getTahunLahir() {
        return tahunLahir;
    }

    public void setTahunLahir(int tahunLahir) {
        this.tahunLahir = tahunLahir;
    }

    @Override
    public String toString() {
        return "Oshi{" + "nama=" + nama + ", tim=" + tim + ", tahunLahir=" + tahunLahir + '}';
    }
}

Terus, buat nyimpen objeknya ke file, gw bikin class baru Main.java

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/**
 *
 * @author arby
 */
public class Main {
    public static void main(String[] args) {
        //bentuk 1 objek Oshi
        Oshi o = new Oshi("Melody", 'J', 1992);
        
        //menyimpan objek oshi "o"
        try {
            FileOutputStream fos = new FileOutputStream("file_oshi.dat");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(o);
            oos.close();
            System.out.println("Tersimpan");
        } catch (IOException ex) {
            System.out.println("Gagal. Error: "+ex);
        }
    }
}

Keliatan kan urutannya… pertama, tentukan file-nya pake FileOutputStream, abis itu simpan objek ke dalam file pake ObjectOutputStream. Kalo udah ditulis, jangan lupa ditutup pake “close”. Untuk tipe data (ekstensi file), itu juga bebas c… gak dipakein ekstensi pun sebenernya gak masalah. Nanti, bakal ada file_oshi.dat yang kebentuk sesuai path class yang kamu punya. Kalo gw, berhubung pake netbeans, kebentuknya di dalam project Netbeans-nya langsung. Hirarkisnya gini:

Selection_005

Kalo kamu liat isinya pake text editor, bakal keluarnya gini:

Selection_006

Dan… selesai lah sudah. Objek kamu berhasil tersimpan. Tapi, yang perlu kamu perhatiin… cara di atas, gak cuma bisa nyimpen 1 objek per file lhoh yah.. kalo kamu bikin 2 objek, anggaplah o1 sama o2, terus kamu tulisin syntax “oos.writeObject(o1);” juga “oos.writeObject(o2);”, yang kesimpen 2 objek itu. Cara ngebuktiinnya?! Hmm… cara ngebuktiinnya, kamu musti baca file tersebut. Bisa liat di file-nya langsung pake editor semacam notepad atau wordpad (soalnya kalo gedit/netbeans langsung dah gw coba, dan berakhir dengan kegagalan buat nampilin isinya)…

O iya, yang perlu kamu perhatiin jugak, tentang konsep penyimpanannya. Konsepnya nimpa lhoh yah… bukan nambah2 data baru kayak penambahan row baris di database. Nimpa… alias replace. Jadi, tiap kamu jalanin kode di atas, isinya bakal nimpa sesuai yang kamu tulisin. Bukan nambah data di baris paling bawahnya.

Kalo buat ngebaca file-nya di program java… uhmmm… postingan berikutnya aja yak… Gw lagi males nulisin. Ditunggu ajah… 😀 Ja naaa… moga ngebantu yak…

Sumber: how-to-write-an-object-to-file-in-java/
Valid: Yap!
Kadaluarsa: Sampe method terkait dinyatain deprecated.

Pertanyaannya adalah: Mengapa…

Jadi yah… gw baru ngebuka koleksi drama korea gw yang dah gw donlot berbulan2 lalu… dan sekarang, lagi nonton drama “Blade Man”. Well, sebenernya ceritanya bikin gw enek. Tokoh antagonisnya keterlaluan banget soalnya… Akting mereka terlalu bagus, jadi bikin gw pengen mecahin layar monitor pas nge-shoot mereka. Paling gak itu menurut gw c yah.. tapi tetep ajah gw tonton. Masi ada komedi2nya dikit soalnya 😛

Tapiiii…. bukan cerita tuh drama yang mau gw bahas di mari. Gw lebih pengen nyeritain satu scene dengan potongan gambar kayak gini:

vlcsnap-2015-05-10-20h35m13s55

vlcsnap-2015-05-10-20h35m23s190

vlcsnap-2015-05-10-20h35m44s148

vlcsnap-2015-05-10-20h36m41s192

Scene di atas, ngingetin gw tentang masa sekolah gw… plus.. pembicaraan gw ma teteh yang menghasilkan tulisan di post sebelumnya. Oke, gw ceritain runut yak.. Jadi gini, dulu, gw punya guru les privat. Karena satu dan lain hal, mulai awal kelas 9 sampai akhir kelas 10, gw gak boleh lagi ngeles di lembaga bimbel ama Nyokap… tapi diajarin private ama sodara jauhnya tetangga. Beliau mahasiswi universitas berbasis pendidikan dengan major Kimia.

Yang paling keren dari beliau yaitu… passionnya… passion yang Kak Wid miliki untuk bidang keilmuan yang beliau ajarkan (o iya… namanya c Resi, tapi kita manggilnya Kak Wid). Walau majornya Kimia, tapi pas kelas 9 (3 SMP), gw diajarinnya Matematika ma Fisika. Kimia lum diajarin waktu itu di SMP. Dan… Matematika ma Fisika, kita gak cuma diajarin teori sama nyelesaiin masalah. Tapi juga cara belajar kedua mata pelajaran itu. Sebuah ilmu memiliki alasan untuk dipelajari, dan bagaimana ilmu tersebut dapat menyelesaikan masalah tersebut. Mungkin ini agak2 gak penting… plus, yang diajarin beliau bisa jadi agak2 melenceng… tapi metode yang beliau sampaikan semuanya masuk akal. Dan kita jadi tau cara untuk belajar. Bahkan, gak cuma terbatas di 2 mata pelajaran itu… tapi juga mata pelajaran lain kayak Bahasa atau Bahasa Inggris.

Oke, jadi kenapa gw kepikiran sama guru privat gw pas liat scene dari drama korea di atas?! Yaa… karena cara ngajar guru privat gw selalu diselingi penjelasan dari pertanyaan “kenapa”, “mengapa”, dan “bagaimana” yang bisa diajukan ketika menyelesaikan suatu soal, termasuk dalam memahami teori. Termasuk pas waktu gw ngerjain pembagian pecahan.

Sebagai anak yang kreatifitasnya enam koma (ini hasil pas class placement test di SMA), gw gak pernah kayak anak kecil di atas. Gw gak mempertanyakan ke guru gw kenapa bisa sebuah permasalahan dipecahkan dengan cara yang beliau ajarkan. Plus, gw juga gak pernah mempertanyakan cara mereka menilai gw. Anak baik2 lhah gw. Walo faktanya… kalo ama temen sendiri, gw bandelnya minta ampun. Di sinilah peran Kak Wid (guru privat gw tadi), berusaha untuk menurunkan passion yang beliau miliki ke gw (plus teteh gw). Jadi, beliau menjelaskan hal2 yang gak gw tanyain, tapi sepatutnya gw tanyain.

Contohnya ajah… pas waktu gw ngerjain satu soal yang butuh teori pembagian pecahan. Gw c gak nanya… tapi Kak Wid yang langsung nanya ke gw…

“Tau gak, Dek… kenapa harus dikali dengan cara dibalik?”

Karena gw gak tau… yaaa gw cuma jelasin, itu cara yang gw lakuin pas diajarin di kelas 5 dulu. Kalo udah gitu, gw dijelasin lah ama sang guru les asal datangnya. Dan gw… cuma manggut2. Awalnya c berasa gak meaning… tapi lama2, gw jadi paham bahwa satu materi emang terkait dengan materi lain. Dan… setiap materi memiliki definisinya masing-masing. Dari definisi tersebutlah sebaiknya kita memahami materi. Trus lama2… yaaa… gw jadi sukak ama mata pelajaran eksak. Walo yaaa… remedial di Fisika ama Matematika masih belum bisa gw hindari (tapi gw mau nyombong.. buat Kimia, gw kedua tertinggi satu sekolahan pas UAN, chuy! tampak passion Kimia beliau beneran diturunin ke gw).

Jadi begitulah… kadang yang kita butuhkan hanya pertanyaan “Mengapa”. Dan untuk orang2 tertentu, pertanyaan “Mengapa” memang tidak menjadi prioritas… Tapi bukan berarti hal itu tidak pantas ditanyakan. Karena, pencarian jawaban atas pertanyaan tersebut yang akan membuat kita memahami sesuatu.

Bukan cuma untuk hal2 eksak… tapi juga dalam kehidupan sehari-hari, seperti “Kenapa hobi banget ngumpulin batu akik”, “Kenapa gak mau masuk kerja hari ini”, “Kenapa ngerasa gak sukak ama bos sendiri”… Pertanyaan2 yang membutuhkan jawaban dalam bentuk alasan atau mungkin pembenaran… yang pada akhirnya membuat kita mencoba untuk mengerti, paling tidak untuk menumbuhkan rasa untuk memahami. Dan setelahnya… terdapat suatu aksi untuk mencoba menyelesaikannya dalam pertanyaan “Bagaimana”.

Begitulah… Karena pertanyaan yang pertama adalah… “Mengapa”.

Wisuda

Bulan ini senpai gw wisuda S2… dan gw lagi mikir… nanti pas wisudanya senpai… gw bakal datang buat ngasi bunga gak ya??

Bingung

Diambil dari redbubble.net

Yapp! This is a very big deal for me! Taun kemaren, senpai ngehadirin wisuda gw… Walo ngakunya c itu cuma kebetulan lewat. Tapi, yah… sama2 tau ajah sifatnya senpai gw gimana. Lagipula waktu gw wisuda, dilaksanainnya kan pas hari kerja…

Gw sendiri gak sukak ama event2 macam wisuda ataupun event penuh penghargaan lainnya. Bukannya kenapa2… tapi buat gw yang kompetitif dan paling mudah merasa iri ini, hal2 semacam itu cuma berdampak buruk dengan menghasilkan efek keterpurukan yang mendalam. Bahkan gw aja hampir gak ikut wisuda kalo Nyokap gak maksa gw buat daftar. Terlebih, ini wisudanya senpai. Pasti dia dapat banyak bunga dan penghargaan. Gw bakal ngerasa lebih gak berarti daripada yang seharusnya gw rasain.

Begitulah~~ masih bingung mau pergi atau enggak.

Mengakses Field Date pada Database Oracle

As always… ini tulisan rekues! Sebenernya udah lama c yah… dan orangnya yang ngerikues udah nerima jawabannya. Tinggal jawaban balik buat gw dibolehin apa enggak mosting yang dia tanyain di sini… Dan jawabannya, “terserah ajah”. Berhubung kemaren2 gw lagi di luar kota, nih tulisan baru jadi sekarang. 😀

Apapun prolog di atas, intinya si Aa’ nanya ke gw, gimana caranya kerja pake database Oracle, terus di database itu ada field yang tipe-nya Date. Kalo ajah dia nyari tutorialnya di stackoverflow, percayalah… itu jawaban bakal langsung nemu! Tapi, berhubung nih si Aa’ males ngeliat apapun, jadi dia tanya gw ajah. Katanya gw kan mantan asisten OOP. Hhhh… baiklah. (-_-)

Gimana caranya ngakses field itu? Gw tulisin jawabannya singkat ajah yak… Intinya, kalo insert, pake kuerinya gini:

String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,to_date(?,'DD-MM-YYYY','NLS_DATE_LANGUAGE = American'),?)";

Itu si Aa’ pake PreparedStatement, makanya ada tanda tanya gitu… intinya c pas masukin tanggal, bisa masukin pake format DD-MM-YYYY pas nulisinnya. Terus pas di ResultSet pake kode:

ps.setString(3,"27-05-2014");

Atau kalau kamu gak keberatan pake format “YYYY-DD-MM”, bisa pake java.sql.Date… caranya gini:

Date d = Date.valueOf("2014-11-15");
ps.setDate(3,d);

Yang paling penting dari hal di atas, kelas Date di sana diambil untuk class Date dari package java.sql… bukan java.util, yah. Si Aa’ berkali-kali gagal nyoba, gara2 dia ngira tipe Date di atas itu tipe Date dari java.util. Dan yang paling penting jugak buat kamu ketahui, kedua class ini walo namanya sama, mereka gak bisa di-casting gitu ajah. Boleh ajah kamu berhasil ngelakuin casting… tapi tolong kasi kodenya di kotak komentar yak. Gw jugak pengen tau… 😛

Teruuuuss… kalo kamu mau tau gimana caranya ngambil sysdate (tanggal dari system), kamu bisa pake bantuan dari class Date dari package java.util. Di sini, kamu bisa mengkolaborasikan kedua class Date itu. Caranya:

java.util.Date d1 = new java.util.Date();
Date d = new Date(d1.getTime());
ps.setDate(3,d);

Intinya, kamu bikin objek java.sql.Date dengan bantuan dari objek java.util.Date, tepatnya untuk memanggil method “getTime()”, yang bisa ngambil sysdate…

Dan…. trik terakhir, kalo kamu mau ngambil tipe Date dari ResultSet, dan kamu maunya nampilin pake format “dd-MM-YYYY”, ada class yang namanya “SimpleDateFormat”. Pake class itu, kamu bisa atur format tanggalnya. Caranya gini:

Date d = rs.getDate(3);
SimpleDateFormat sm = new SimpleDateFormat("dd-MM-YYYY");
System.out.println("Tanggal: "+sm.format(d));

Dan begitulah….

Kalau kamu mau tau penggalan kode di atas sebenernya lengkapnya tuh gimana… boleh disimak kode di bawah ini:

Untuk kelas Koneksi (KoneksiDB.java)… kelas ini buat ngecek JDBC ama ngembaliin objek class Connection. Kelas ini kebiasaan aja digunain pas kuliah dulu. Gak harus c, cuma ya itu… udah kebiasa… makanya adaan.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class KoneksiDB{
	private Connection conn;
	private final String DB_DRIVER="oracle.jdbc.driver.OracleDriver";
	private final String DB_URL="jdbc:oracle:thin:@localhost:1521/XE";
	private final String USERNAME="";
	private final String PASSWORD="";
	
	public void bukaKoneksi(){
		boolean flag = false;
		try{
			Class.forName(DB_DRIVER);
		}catch(ClassNotFoundException ex){
			System.out.println(ex.getMessage());
			flag = true;
		}
		if(!flag){
			try{
				conn = DriverManager.getConnection(DB_URL,USERNAME,PASSWORD);
			}catch(SQLException ex){
				System.out.println(ex.getMessage());
			}
		}
	}
	public Connection getConn(){
		return this.conn;
	}
}

Kelas Main yang digunain buat INSERT database:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,to_date(?,'DD-MM-YYYY','NLS_DATE_LANGUAGE = American'),?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG04");
			ps.setString(2,"Tisu Kering");
			ps.setString(3,"27-05-2014");
			ps.setInt(4,20);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

Kelas Main… contoh buat ngambil value dari string dengan format “YYYY-MM-DD”:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,?,?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG03");
			ps.setString(2,"Sabun Cuci");
			Date d = Date.valueOf("2014-11-15");
			ps.setDate(3,d);
			ps.setInt(4,100);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

Kelas Main yang dibikin buat ngambil sysdate:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		String kueri = "INSERT INTO pergudangan (IDBARANG, NAMA, TGL_MASUK, STOK) VALUES (?,?,?,?)";
		int rowAffect=0;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			ps.setString(1,"BRG03");
			ps.setString(2,"Sabun Cuci");
			java.util.Date d1 = new java.util.Date();
			Date d = new Date(d1.getTime());
        	ps.setDate(3,d);
			ps.setInt(4,100);
			rowAffect = ps.executeUpdate();
			ps.close();
		}catch(SQLException ex){
			System.out.println(ex);
		}
		if(rowAffect==0){
			System.out.println("Query Gagal");
		}else{
			System.out.println("Query Berhasil");
		}
		
	}
}

dan terakhir…. kelas Main buat nampilin tanggal pake format “dd-MM-YYYY”:

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Date;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;

public class Main{
	public static void main(String args[]){
		KoneksiDB k = new KoneksiDB();
		k.bukaKoneksi();
		Connection kon = k.getConn();
		
		String kueri="SELECT * FROM pergudangan";
		ResultSet rs = null;
		try{
			PreparedStatement ps = kon.prepareStatement(kueri);
			rs = ps.executeQuery();
			while(rs.next()){
				System.out.println("ID Barang: "+rs.getString(1));
				System.out.println("Nama Barang: "+rs.getString(2));
				Date d = rs.getDate(3);
				System.out.println("Tanggal Masuk: "+rs.getString(3));
				SimpleDateFormat sm = new SimpleDateFormat("dd-MM-YYYY");
				
				System.out.println("Tanggal: "+sm.format(d));
				System.out.println("Stok: "+rs.getInt(4)+"\n");
			}
		}catch(SQLException ex){
			System.out.println(ex);
		}
		
	}
}

Begitulaaahhh~~ moga ngebantu yah, guyz….

Valid?: Banget.
Masa Kadaluarsa: Gak tau.
Sumber: stackoverflow, pribadi.

Membuat .jar File dari Kode Java

Jadi gini… lagi2 ada yang nanya… Kalo diliat polanya, pas mosting yang agak serius, itu pasti karena requirement dari seseorang. Entah itu temen, si Aa’, atau sapa lhah… Seolah gw gak bisa bikin sesuatu yang serius, kecuali berupa tanggapan. Huweeee….

Apapun itu, intinya ada yang nanya ke gw, gimana cara bikin file berekstensi jar dari codingan java yang udah dia bikin. Hmmm, gimana yah… Kalo gw biasanya nyuruh dia pake IDE, terus coding pake Netbeans, trus kalo dah selesai, klik kanan di project Netbeans-nya, pilih “Build”. Ntar bakal ada folder “dist” kebentuk dalam folder project, dan itu bisa dijalanin gitu ajah, asal mesinnya keinstal JRE. Tapi, requirement-nya dia lagi gak make Netbeans dan emang cuma pake editor sederhana, yang gak bisa generate IDE-nya langsung.

Okeh… permintaan di atas, mirip2 sama tugas kuliah… Tapi baiklah, berhubung gw baik… jadi gw jelasin aja di mari. Buat yang gak tau apa itu file berekstensi jar, gw jugak bakal jelasin di mari. Ekstensi jar merupakan file java archive. Jadi kayak kamu ngegabungin beberapa file menjadi sebuah file lain. Pernah nge-compress beberapa file jadi 1 file zip/rar? Kalo pernah, yaaa yang kamu lakuin mirip2 ama compress itu. Bedanya, file jar ini bukan berfungsi buat nge-compress, tapi buat ngegabungin semua file class (hasil compile file java) yang udah kamu buat supaya bisa jalan dan jadi sistem yang utuh, walau kesebar di beberapa file codingan. Intinya, file .jar itu merupakan executable file yang terdiri dari satu atau beberapa file yang kamu gunakan untuk membuat sebuah aplikasi berbasis java.

Cara gampang untuk meng-generate file jar yaitu dengan menggunakan editor IDE kayak Eclipse atau Netbeans. Caranya kayak yang udah gw jelasin di atas. Ada cara gampang, ada juga cara native pastinya… Cara native ini kemungkinan yang dilakukan banyak programmer sebelum IDE diciptakan oleh mereka. Cara native-nya pake command “jar” di terminal/console/command prompt. Berhubung sekarang lagi ngetik di komputer berbasis  Windows, jadi gw praktekkin di windows, yak. Yang linux sama ajah… gak ada beda.

Sebelumnya, gw bakal ngasi tau kalo command jar punya beberapa opsi, diantaranya c, m, f, x, t dll. Penjelasannya gini:

  1. c: buat “create” file jar
  2. m: buat memodifikasi file MANIFEST.MF yang ada di folder META-INF
  3. f: untuk merujuk ke sebuah file yang diberikan, jadi keluarannya bukan stdout gitu
  4. x: buat nge”eXtract” file jar
  5. t: buat melihat isi dari file jar yang dimaksud

Contoh? Oke.. gini, pertama, bikin dulu file java yang ada “public static void main(String args[])”-nya biar bisa di-running.

public class Main{
	public static void main(String args[]){
		System.out.println("Hello World");
	}
}

Kompile dan run file java itu…

1. Eksekusi dan Jalankan

Yang perlu kamu ketahui, setiap kamu nge-running java, sebenernya yang kamu jalanin adalah file .class-nya, dan bukan file java-nya. Jadi, dalam jar, kamu cukup masukin file .class yang kamu butuhin… gak usah semuanya jugak. Tapi kalo kamu mau masukin semuanya, juga gak masalah. Kamu tinggal pake command “*” ajah… Gak usah pilih2…

Jadi… langkah selanjutnya, kamu masukin file Main.class ke dalam sebuah file jar, pake command jar

2. Bentuk Jar

Command itu gak usah gw jelasin yah maksud “cf”-nya. Kan udah di atas… Kalo hai.jar, itu nama file jar yang kamu mau, dan setelahnya ada Main.class… itu file class yang mau dimasukin ke file jar-nya. File jar ini, seharusnya udah bisa kamu jalanin… tapi biasanya, yang terjadi c belum bisa dijalanin. Cobain deh gini:

3. Jalankan Jar

Bilangnya, belum ada “main” di manifest sebagai atribut. Mungkin kamu bingung, dan gw lebih bingung lagi ngejelasinnya. Tapi intinya, pas kamu bikin file jar tersebut, ada file MANIFEST.MF dari folder META-INF yang di-generate secara default oleh sistemnya, karena file ini emang dibutuhin sama si file jar-nya. Bentuk default-nya kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)

Isi dari file MANIFEST.MF itu belum lengkap, karena kita gak specified class yang punya “public static void main(String args[])” tuh yang mana. Makanya error-nya gitu. Uhhmmm… nangkep kan maksud gw?! Okeh, nangkep atau enggak, gw bakal kasi tau solusinya. Kamu extract dulu file jar yang tadi pake command gini:

4. Jar Salah

Dan nanti, ada file tambahan di folder tempat kamu nge-ekstract file hai.jar.

5. Struktur File

Ada folder META-INF. Di dalamnya ada MANIFEST.MF. Ubah isi file MANIFEST.MF pake editor favorit kamu (bisa gedit/notepad++/notepad) jadi kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)
Main-Class: Main

Yang gw merahin merupakan nama Class yang bisa di-running (ada public static void main(String args[])). Kalo Class gw kan namanya Main.class, jadi gw bikinnya “Main”. Save, dan tutup editornya. Gak ditutup juga gak papa c. Terus, kamu bikin lagi file jar pake MANIFEST yang udah kamu ubah isinya tadi dan running. Caranya gini:

6. Bentuk Jar

Yang perlu kamu perhatiin, kamu harus nambahin satu karakter kosong sehabis kamu ngubah file MANIFEST.MF, jangan kayak gini:

7. Manifest Salah

Kenapa?! karena kalo gak, yaaa bakal jadi kayak gini kalo kamu running, hal ini lah yang bakal kamu temuin:

8. Jar Salah

Jadi bikinnya, paling gak ada karakter space kayak gini (space lhoh yah… whitespace juga gak ngaruh):

9. Manifest Benar

Dan buat kamu yang bertanya-tanya, kenapa ngejalaninnya pake “java -jar”, bukannya klik dua kali… kan executable?? Gak ada yang bisa gw jawab kecuali “yaaa.. karena tipe aplikasi yang dibikin itu sifatnya console-based”. Jadi jalaninnya tetap di console/terminal/command prompt/cmd. Kalo kamu bikin aplikasi GUI, ntar juga bisa dijalanin pake klik 2x. Dan begitulaaahhhh…. Pertanyaan dan saran, boleh langsung di kotak komentar, yak…

PS: kalo ada yang nanya, buat library eksternal kayak JDBC kalo mau di-running, daftarinnya gimana… Jawabannya gini: “tinggal kamu tambahin atribut Class-Path di file MANIFEST.MF”. Contohnya gini:

10. Manifest dengan Path

Dan struktur folder-nya gini:

11. Bentuk Jar

Kalo library lain ada lagi yang mau ditambahin, tinggal dikasi spasi ajah kayak gini:

Manifest-Version: 1.0
Created-By: 1.7.0_55 (Oracle Corporation)
Main-Class: Main
Class-Path: lib1.jar lib2.jar lib3.jar

PPS: Kalo ada yang nanya lagi, “itu… file MANIFEST.MF sebenernya buat apa dan harus kayak di atas bikinnya? Generate dulu, extract, baru pake yang ada?” sebenernya enggak. Jawabannya: “gw gak tau yah buat apa sebenernya, tapi kayaknya buat spesifikasi pas nge-running java…kan ada atribut Main-Class gitu, terus kalo harus gitu bikinnya… enggak c yah. Kamu bisa bikin sendiri file MANIFEST.MF itu pake editor biasa, asalkan encoding-nya pake UTF-8”. Contohnya, gini.. gw bikin sendiri MANIFEST.MF kayak di atas, terus gw generate lagi kayak gini:

12. Akhir

Dan selesai… Begitulah caranya.. Moga membantu…

Valid: Iyap!
Kadaluarsa: Gak tau
Sumber: situs oracle, stackoverflow.com sama dok pribadi

Set Classpath Library JDBC

Kemaren si Aa’ nanya ke gw tentang koneksi dari java ke oracle. Sebenernya inih gampang c yah. Tinggal pake IDE terus tambahin library, trus bikin class buat buka koneksi. Sayangnya rekuesan yang gw terima, gak boleh pake IDE. Gak tau apa maunya si Aa’, tapi ya sudahlah… Sebagai adek yang baek, gw kasih tau caranya. Dan ternyata, gw juga gagal!

Kesalahan yang gw lakukan adalah, gw gak tau caranya nge-set classpath jdbc di library java. Dan kalo udah berhasil nge-set classpath, nanti juga berhasil.

Sebenernya ada beberapa cara yang gw lakukan terkait hal ini… yaitu:

1. Download jdbc di situs oracle.

Downloadnya di situs ini. Sebenernya, kalo windows, ini bisa diambil langsung… di tempat instal oracle, terus ke direktori tertentu. Anggap kamu nginstall oracle 11g rilis 2 di drive D:, alamat library-nya ada di D:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib. Di folder tersebut, ada 2 versi ojdbc. Satunya ojdbc6.jar, satunya lagi ojdbc6_g.jar. Sebenernya 2 itu sama ajah c, cuma ada bedanya… gw juga lupa apa. Masalah compile gitu? Entah apapun itu, gw pakenya yang gak pake huruf g. Kalo di linux, gw gak tau… Makanya gw download, bukan nyari di tempat nginstallnya.

2. Bikin class koneksi sebagai berikut:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 
 
public class Koneksi{ 
   private final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver"; 
   private final String DB_URL="jdbc:oracle:thin:@//localhost:1521/XE"; 
   private final String USER ="uname"; 
   private final String PASSWORD="pwd"; 
   private Connection conn = null; 
   
   public void bukaKoneksi(){ 
       boolean flag = false; 
       try{ 
	  Class.forName(JDBC_DRIVER); 
       }catch(Exception e){ 
	  System.out.println("Error: "+e); 
          flag = true; 
       } 
       /*if(!flag){ 
	  try{ 
	     conn = DriverManager.getConnection(DB_URL,USER,PASSWORD); 
	  }catch(Exception e){ 
	     System.out.println(e.getMessage()); 
          } 
	  
       }*/ 
   } 
   public Connection getConn(){ 
	return conn; 
   } 
}

Standar kan yah?! Iya! Standar… Jadi gw coba compile, terus bikin class buat ngejalanin gini:

public class Main{ 
   public static void main(String args[]){ 
      Koneksi k = new Koneksi(); 
      k.bukaKoneksi(); 
   } 
}

Dan ternyata, yang gw dapetin adalah Error… ClassNotFoundException! Driver-nya gak kebaca, sodara2! Gw nyari2, kalo di windows, ternyata bisa copy-in di bagian lib\ext dari direktori penginstalan Java. Jadi kalo kamu punya java 64 bit di mesin kamu (Windows 7), kemungkinan letaknya di “C:\Program Files\Java\jdk1.7.0_55\jre\lib\ext“. Kalo udah gini, program kamu bakal berhasil dijalanin tanpa error. Tapi… sayangnya, ini gak berlaku di linux. Gw gak ngerti kenapa.

Walopun gitu, terlepas dari bisa atau gak, cara di atas sebaiknya gak kamu lakuin yah… Karena library dari compiler sebaiknya gak kamu tambahin apapun. Yang perlu dilakukan yaitu nambahin classpath dengan value berupa path direktori tempat peletakan library jdbc-nya (ojdbc6.jar yang tadi). Kalo di linux yang gw lakukan gini:

di terminal, ketikin:

sudo gedit ~/.bash_profile

dan kebuka sebuah file, tambahin baris gini

CLASSPATH=$CLASSPATH:/home/user/Documents/jdbc/ojdbc6.jar 
export CLASSPATH

Yang “/home/user/Documents/jdbc/ojdbc6.jar”, itu merupakan path tempat peletakan si library jdbc. Terus save, keluar deh… Kalo di windows, bisa pake:

set classpath=E:\JDBC\ojdbc6.jar;.

Jangan lupa buat nambahin titik koma sama titik di akhirnya, yah. Gw coba di komputer Aa’, dan kelupaan ngasi titik, jadinya gak bisaan gitu. Lebih jelasnya, kamu bisa liat di link video ini. Kalo dah ngatur kayak gitu, kamu bisa compile kode java kamu dengan nyaman… Kayak biasa ajah compile sama nge-run Nya.

PS: Pastiin classpath-nya bener pake command “echo $CLASSPATH”. Untuk nama variabel, sifatnya case sensitive lhoh yah.. Jadi jangan sampe salah.

Menampilkan 2 Angka Belakang Koma dengan Java

Beberapa hari yang lalu, ada yang nanyain ke gw tentang cara nampilin sebuah hasil pembagian biar jadi 2 angka belakang koma di java. Well, sebenernya ini hal dasar yang musti diketahui pas pertama kali belajar java. Minimal nyentuh bahasa pemrograman java lhah… Tapi tampak para dosen jaman sekarang lebih focus berkutat sama logika dan proses pembelajaran dibandingkan hasil akhir, jadilah akhirnya pas nemu kasus beneran, ada ajah pertanyaan “lucu” kayak gitu.

Eh tapi gw gak maksud memojokkan dosen jaman sekarang lhoh yah… Buktinya masih ada kok yang gak gitu. Contoh aja senpai gw yang baru lulus S2. Kata senpai gw, di era digital dengan keberadaan internet di mana semua  source bisa didapatin dengan gampang, yang diperluin ama mahasiswanya itu skill buat ngebaca dokumentasi atau paling gak, tahu keyword buat nyari di stackoverflow atau google.

Balik lagi ke kasus awal kita… Sebenernya ada beberapa cara buat nampilin 2 angka belakang koma. Beberapa di antaranya yaitu:

1. Menggunakan decimal format

import java.text.DecimalFormat;

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        DecimalFormat df = new DecimalFormat("#.##");
        System.out.println(df.format(x));
    }
}

Hasil akhir:

1. Hasil Decimal Format

Angka signifikan di belakang koma bisa kamu ganti di parameter dalam konstruktor DecimalFormat (yang ada karate pagar—baris warna merah). Contohnya, kalo kamu mau ganti 3 angka belakang koma, bisa pake format (#.###).

2. Menggunakan format String (String.format).

Contoh:

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        System.out.println(String.format("%.2f", x));
    }
}

Hasil akhir bakal sama kayak di atas, dan kalo kamu butuh penambahan angka signifikan, tinggal ganti parameter di method format dari class String. Jadi kalo butuh 3 angka belakang koma, ubah baris buat nampilin jadi kayak gini: “System.out.println(String.format(“%.3f”, x));”. Parameter %.2f itu maksudnya, tampilkan sebuah float dengan angka belakang koma sebanyak 2, dan ikutin aja polanya. Seandainya butuh 5 angka belakang koma, kamu bisa kasih parameter %.5f.

3. System.out.printf (Favorit gw)

Contoh:

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        System.out.printf("%.2f",x);
    }
}

Hasilnya sama ama kayak di atas, dan pola parameter juga sama. Kalo mau digabung sama string lain juga gampang. Anggap kamu mau nampilin variabel x jadi gini: “Hasil: 0.928”, kamu bisa ubah baris printf jadi kayak gini: “System.out.printf(“Hasil: %.3f \n”,x);”. Kalo karakter \n itu maksudnya buat nambah baris baru.

4. Membulatkan isi/nilai variabel

Hal-hal sebelumnya dimaksudkan biar kita bisa nampilin bilangan berkoma banyak jadi tampil dengan beberapa angka signifikan belakang koma. Tapi, kalo ternyata yang kamu mau itu gak cuma sekedar menampilkan, tapi juga mengubah isi variabel menjadi bentuk pembulatan, kamu bisa ngelakuin trik semacam ini:

public class NewClass1 {
    public static void main(String[] args) {
        double x = 0.92837;
        int angkaSignifikan = 2;
        double temp = Math.pow(10, angkaSignifikan);
        double y = (double) Math.round(x*temp)/temp;
        System.out.println("Sebelum Pembulatan: "+x);
        System.out.println("Setelah Pembulatan: "+y);
    }
}

Hasilnya jadi kayak gini:

2. Pembulatan

Kalo kamu mau ngubah jumlah angka signifikan belakang koma, kamu bisa ubah2 nilai di variabel angkaSignifikan.

Valid: Yap
Masa Kadaluarsa: Teruji di Java 1.7.0_55
Sumber:
– http://stackoverflow.com/questions/153724/how-to-round-a-number-to-n-decimal-places-in-java
– http://stackoverflow.com/questions/16408253/rounding-off-2-decimal-places-in-java-for-whole-number