Panduan Memakai Tipe Data Angka Di Plugin simple-jpa


Plugin simple-jpa 0.4 dapat di-install dengan memberikan perintah install-plugin simple-jpa 0.4

Untuk mempermudah konversi tipe data, simple-jpa 0.3 akan menggunakan node numberTextField() yang akan menghasilkan sebuah komponen turunan dari JFormattedTextField.  Fasilitas scaffolding bila menemukan tipe data angka, termasuk BigDecimal dan BigInteger, akan secara otomatis menggunakan numberTextField().

Sebagai contoh, untuk domain class berikut ini:

@DomainClass @Entity @Canonical
class Latihan {
  Byte angka1
  Short angka2
  Integer angka3
  Long angka4
  Float angka5
  Double angka6
  BigInteger angka7
  BigDecimal angka8
}

akan menghasilkan view yang memakai komponen numberTextField() seperti berikut ini:

label('Angka1:')
numberTextField(id: 'angka1', columns: 20, bindTo: 'angka1', errorPath: 'angka1')
errorLabel(path: 'angka1', constraints: 'wrap')

label('Angka2:')
numberTextField(id: 'angka2', columns: 20, bindTo: 'angka2', errorPath: 'angka2')
errorLabel(path: 'angka2', constraints: 'wrap')

...

label('Angka8:')
numberTextField(id: 'angka8', columns: 20, bindTo: 'angka8', nfParseBigDecimal: true, errorPath: 'angka8')
errorLabel(path: 'angka8', constraints: 'wrap')

Untuk melakukan binding ke model saat ini, pengguna perlu memberikan bindTo diikuti dengan nama atribut di model.  Binding secara otomatis akan bersifat mutual.

Pada tipe data BigDecimal, pengguna wajib memberikan nfParseDigDecimal: true agar parsing BigDecimal dilakukan secara benar (bila tidak, akan dianggap sebagai double).

Btw, apa perbedaan antara BigDecimal dan double?  Nilai bilangan desimal pada double merupakan sebuah upaya pendekatan yang nilainya tidak mutlak sementara nilai bilangan desimal pada BigDecimal bersifat pasti. Sebagai contoh, berikut ini adalah kode program:

double d1 = 10000.11 
double d2 = 0.01 
double d = d1-d2*d1 
println "Diskon 1% dari $d1 adalah $d" 

BigDecimal b1 = new BigDecimal("10000.11") 
BigDecimal b2 = new BigDecimal("0.01") 
BigDecimal b = b1.minus(b2.multiply(b1)) 
println "Diskon 1% dari $b1 adalah $b"

Bila kode program Groovy tersebut dijalankan (misalnya di Groovy Console), hasilnya adalah:

Diskon 1% dari 10000.11 adalah 9900.108900000001 
Diskon 1% dari 10000.11 adalah 9900.1089

Terlihat bahwa pada pada versi yang memakai double, hasil perhitungan tidak akurat!  Selisih ini bisa diabaikan untuk perhitungan trivial (misalnya pada komputasi koordinat grafis untuk game), tetapi untuk perhitungan yang sifatnya penting seperti untuk perhitungan yang menyangkut nilai uang, sebaiknya menggunakan BigDecimal.

Karena numberTextField() adalah sebuah JFormattedTextField, maka angka yang diketik oleh pengguna akan secara otomatis diformat seperti yang terlihat pada gambar berikut ini:

Tampilan Angka Akan Diformat Secara Otomatis

Tampilan Angka Akan Diformat Secara Otomatis

Pengguna dapat mengatur format yang dipakai dengan memberikan nilai atribut type pada numberTextField().  Nilai atribut type yang diperbolehkan adalah ‘currency’, ‘percent’ dan ‘integer’.  Masing-masing setara dengan memanggil method getCurrencyInstance(), getPercentInstance(), getIntegerInstance() dari DecimalFormat.  Format yang dipakai secara default (bila tidak ditentukan) adalah DecimalFormat.getNumberInstance().

Sebagai contoh saya mengubah kode program view menjadi:

label('Angka5:')
numberTextField(id: 'angka5', columns: 20, bindTo: 'angka5', type: 'integer', errorPath: 'angka5')
errorLabel(path: 'angka5', constraints: 'wrap')
label('Angka6:')
numberTextField(id: 'angka6', columns: 20, bindTo: 'angka6', type: 'percent', errorPath: 'angka6')
errorLabel(path: 'angka6', constraints: 'wrap')
label('Angka7:')
numberTextField(id: 'angka7', columns: 20, bindTo: 'angka7', type: 'currency', errorPath: 'angka7')
errorLabel(path: 'angka7', constraints: 'wrap')

Hasilnya format pada ketiga numberTextField() di atas akan terlihat seperti pada gambar berikut ini:

Pengaturan type Untuk numberTextField()

Pengaturan type Untuk numberTextField()

Sebagai informasi tambahan, format yang ada sesuai dengan Locale yang sedang aktif.  Sebagai contoh, saya akan melakukan perubahan Locale dengan membuka file griffon-app/lifecycle/Initialize.groovy dan menambahkan baris berikut ini:

Locale.setDefault(new Locale("id", "ID"))

Selain melalui kode program, pengaturan locale juga dapat dilakukan dengan menambahkan baris locale pada Application.groovy seperti pada berikut ini:

application {
  title = 'Latihan'
  startupGroups = ['mainGroup']
  autoShutdown = true
  locale = 'ID_id'
}

Bila aplikasi dijalankan, format yang dipakai oleh numberTextField() sekarang akan menggunakan tata cara di Indonesia, seperti yang terlihat pada gambar berikut ini:

Format yang mengikuti Locale

Format yang mengikuti Locale

Pengaturan lain yang dapat diberikan pada numberTextField() adalah dengan memberikan atribut yang diawali dengn nf.  Atribut ini akan memanggil setter yang ada di NumberFormat (lihat http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html).  Sebagai contoh, atribut nfMaximumFractionDigits akan memanggil method setMaximumFractionDigits() dari NumberFormat.

Kode program berikut ini:

numberTextField(id: 'angka8', columns: 20, bindTo: 'angka8', 
  nfParseBigDecimal: true,
  nfMaximumIntegerDigits: 5, 
  nfMaximumFractionDigits: 2, 
  nfRoundingMode: RoundingMode.DOWN,
  errorPath: 'angka8')

akan menyebabkan:

  • Makimal hanya lima digit bagian bilangan bulat (sebelum tanda pemisah desimal) yang bisa diberikan.  Bila pengguna mengetik lebih dari lima digit, maka yang diambil hanya lima digit terakhir.
  • Angka dibelakang koma maksimal hanya dua digit.
  • Pembulatan yang dipakai bila angka dibelakang koma melebih dua digit adalah pembulatan ke bawah.  Sebagai contoh, bila mengguna mengetik 12345,127 maka yang ditampilkan adalah 12.345,12.  Secara default, 12345,127 akan dibulatkan menjadi 12.345,13.

PENTING:  Pengaturan atribut di atas hanya berlaku untuk men-format tampilan angka.  Yang disimpan ke database nantinya tetap adalah apa yang diketik oleh pengguna sebelum di-format.  Hal ini dapat membingungkan pengguna dan tidak disarankan.  Salah satu contoh kasus dimana atribut di atas dipakai adalah pada numberTextField() yang hanya menampilkan angka dan tidak dapat di-isi. Untuk membuat numberTextField() hanya menampilkan data dan tidak dapat di-isi, tambahkan atribut editable: false.

simple-jpa 0.3 juga memiliki sebuah komponen lain, yaitu maskTextField().  Komponen ini tidak hanya dapat dipakai untuk angka, tetapi juga dapat dipakai pada teks yang memiliki format tertentu.  Komponen ini pada dasarnya adalah sebuah JFormattedTextField yang memakai MaskFormatter.  Informasi mengenai MaskFormatter dapat dibaca di http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html.

Sebagai contoh, saya mengubah definisi domain class menjadi seperti berikut ini:

@DomainModel @Entity @Canonical
class Latihan {

  String nama

  String nomorTelepon

}

Lalu saya memberikan perintah:

generate-all * --force-overwrite

Pada LatihanView.groovy di atribut nomorTelepon, saya mengubah penggunaan textField() menjadi maskTextField() seperti yang terlihat berikut ini:

maskTextField(id: 'nomorTelepon', columns: 20, 
   bindTo: 'nomorTelepon', 
   mask: '(####) ######', 
   errorPath: 'nomorTelepon')

Bila dijalankan, tampilan program akan terlihat seperti berikut ini:

Tampilan maskTextField()

Tampilan maskTextField()

Pengguna wajib mengisi nomor telepon dengan 4 angka di dalam tanda kurung, dan 6 angka setelah tanda kurung.  Pengguna tidak akan bisa memasukkan karakter lain selain angka (hal ini karena mask memakai # yang berarti harus di-isi dengan angka).

Sama seperti pada numberTextField(), setter untuk MaskFormatter dapat dipanggil dengan memberikan atribut yang diawali dengan mf.  Sebagai contoh, atribut mfPlaceholderCharacter akan memanggil setPlaceholderCharacter() milik MaskFormatter, seperti yang terlihat berikut ini:

maskTextField(id: 'nomorTelepon', columns: 20, 
   bindTo: 'nomorTelepon', 
   mask: '(####) ######', 
   mfPlaceholderCharacter: '_', 
   errorPath: 'nomorTelepon')

Tampilan dari kode program di atas akan terlihat seperti pada gambar berikut ini:

Tampilan maskTextField() Setelah Penambahan Atribut mfPlaceholderCharacter

Tampilan maskTextField() Setelah Penambahan Atribut mfPlaceholderCharacter

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: