Jumat, 26 Desember 2014

Validasi Penulisan Angka Desimal pada Textbox dengan VB.NET (Part 3) [END]

Posting ini saya buat untuk menyempurnakan source code saya sebelumnya. Hasilnya :
  • Textbox hanya bisa menerima input angka.
  • Textbox hanya bisa diinput dengan 1 huruf pemisah desimal (koma atau titik).
  • Textbox hanya bisa diinput huruf minus (-) jika textbox masih kosong.
  • Textbox akan otomatis memberikan pemisah ribuan. (seperti kalkulator windows jika diaktifkan fitur digit grouping)

Untuk mencoba source code berikut, anda cukup menambahkan 1 buah textbox ke dalam form. Selanjutnya, tinggal dipastekan pada bagian source code form tersebut. Berikut adalah source codenya :

Option Strict On

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.TextBox1.TextAlign = HorizontalAlignment.Right
        Me.TextBox1.MaxLength = 20
    End Sub

    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        Select Case e.KeyChar
            Case CChar(vbBack) 'JIKA TOMBOL BACKSPACE
                e.Handled = False 'LANJUT INPUT
            Case "0"c, "1"c, "2"c, "3"c, "4"c, "5"c, "6"c, "7"c, "8"c, "9"c 'JIKA TOMBOL 0-9
                e.Handled = False
            Case "-"c 'JIKA TOMBOL - (MINUS)
                If Me.TextBox1.Text.Contains("-"c) = True Then 'JIKA TEXTBOX SUDAH PUNYA HURUF MINUS
                    e.Handled = True 'STOP INPUT
                Else 'JIKA TEXTBOX BELUM ADA HURUF MINUS
                    If Me.TextBox1.Text = String.Empty Then 'JIKA TEXTBOX MASIH KOSONG
                        e.Handled = False 'LANJUT INPUT HURUF MINUS
                    Else 'JIKA BELUM ADA HURUF MINUS TAPI SUDAH ADA ANGKA
                        e.Handled = True 'STOP INPUT HURUF MINUS
                    End If
                End If
            Case CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) 'JIKA TOMBOL PEMISAH DESIMAL
                'JIKA SUDAH ADA HURUF PEMISAH DESIMAL
                If Me.TextBox1.Text.Contains(CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)) = True Then
                    e.Handled = True 'STOP INPUT
                Else 'JIKA BELUM ADA HURUF PEMISAH DESIMAL
                    If Me.TextBox1.Text = String.Empty Then 'JIKA TEXTBOX MASIH KOSONG
                        'TAMBAHKAN O (NOL) DIDEPAN HURUF PEMISAH DESIMAL
                        Me.TextBox1.Text = "0"c & CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)
                        'STOP INPUT
                        e.Handled = True
                        'PINDAHKAN CURSOR DITEXTBOX KE BELAKANG TEXT
                        Me.TextBox1.Select(Me.TextBox1.Text.Length, 0)
                    Else 'JIKA BELUM ADA HURUF PEMISAH DESIMAL TAPI SUDAH ADA ANGKA
                        e.Handled = False 'LANJUT INPUT
                    End If
                End If
            Case CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberGroupSeparator) 'JIKA TOMBOL PEMISAH RIBUAN
                'JIKA SUDAH ADA HURUF PEMISAH DESIMAL
                If Me.TextBox1.Text.Contains(CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)) = True Then
                    e.Handled = True 'STOP INPUT
                Else 'JIKA BELUM ADA HURUF PEMISAH DESIMAL
                    If Me.TextBox1.Text = String.Empty Then 'JIKA TEXTBOX MASIH KOSONG
                        'TAMBAHKAN O (NOL) DIDEPAN HURUF PEMISAH DESIMAL
                        Me.TextBox1.Text = "0"c & CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator)
                        'STOP INPUT
                        e.Handled = True
                        'PINDAHKAN CURSOR DITEXTBOX KE BELAKANG TEXT
                        Me.TextBox1.Select(Me.TextBox1.Text.Length, 0)
                    Else 'JIKA BELUM ADA HURUF PEMISAH DESIMAL TAPI SUDAH ADA ANGKA
                        e.KeyChar = CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) 'LANJUT INPUT TAPI HURUFNYA DIUBAH
                    End If
                End If
            Case Else 'JIKA BUKA TOMBOL BACKSPACE, 0-9, -, PEMISAH DESIMAL, PEMISAH RIBUAN
                e.Handled = True 'STOP INPUT
        End Select
    End Sub

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
        If Me.TextBox1.Text <> String.Empty Then 'JIKA TEXTBOX BERISI
            'HILANGKAN PEMISAH RIBUAN DULU
            Dim temp As String = Me.TextBox1.Text.Replace(System.Globalization.NumberFormatInfo.CurrentInfo.NumberGroupSeparator, String.Empty)
            'JIKA SUDAH ADA HURUF PEMISAH DESIMAL (ANGKA KOMA)
            If temp.Contains(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator) = True Then
                'BAGI MENJADI 2 BAGIAN
                Dim xxx() As String = temp.Split(CChar(System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator))
                'ISI TEXTBOX DENGAN BAGIAN KE-1 YANG DIFORMAT SEHINGGA ADA PEMISAH RIBUAN KEMUDIAN DIGABUNG DENGAN KOMA DAN BAGIAN KE-2
                Me.TextBox1.Text = CDec(xxx(0)).ToString("N0") & System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator & xxx(1)
                'PINDAHKAN CURSOR KE BAGIAN BELAKANG TEXT
                Me.TextBox1.Select(Me.TextBox1.Text.Length, 0)
            ElseIf Me.TextBox1.Text = "-"c Then
                'TIDAK LAKUKAN APA-APA KARENA MERUPAKAN INPUT MINUS PERTAMA
            Else 'JIKA BELUM ADA HURUF PEMISAH DESIMAL (ANGKA KOMA)
                Me.TextBox1.Text = CDec(temp).ToString("N0") 'ISI TEXTBOX DENGAN ISI TEXTBOX YG SUDAH DIFORMAT
                Me.TextBox1.Select(Me.TextBox1.Text.Length, 0) 'PINDAHKAN CURSOR KE BELAKANG TEXT
            End If
        End If
    End Sub
End Class

Penjelasan : 
  • Pada method Form1_Load, property textAlign pada textbox di set menjadi rata kanan dan jumlah huruf yang bisa di terima textbox tersebut adalah 20 dengan tujuan untuk menghindari error konversi ke tipe angka (desimal) jika huruf yang diinput lebih banyak dari 20 buah. 
  • Pada method TextBox1_KeyPress, source code berfungsi untuk membatasi input yang bisa diterima yakni angka, huruf pemisah desimal dan huruf minus. Fungsi ini sudah pernah dibahas pada posting saya sebelumnya
  • Pada method TextBox1_TextChanged, source code berfungsi untuk menampilkan pemisah ribuan ketika kita mengetik. 
 Demikan pembahasan ini. Jika ada yang kurang dipahami atau mau bertanya atau muncul error ketika dicoba, silakan beri komentar pada bagian bawah berikut. Silahkan dicoba dan semoga berhasil. ^_^

3 komentar:

  1. ko untuk menjumlah textbox1 dengan textbox2 malah tergabung ? Tolong dong mas

    BalasHapus
  2. Mungkin masalah tipe data yakni string sehingga hasilnya tergabung. Coba convert ke tipe data numerik (bisa menggunakan CInt atau Cdbl atau fungsi konversi yang lainnya.
    Contoh :
    Dim aaa as Double = 0
    aaa = Cdbl(Me.TextBox1.Text) + Cdbl(Me.TextBox2.Text)
    MessageBox.Show(aaa)

    BalasHapus