Bazı durumlarda text kutularımıza sadece sayısal değer veya para değeri girmemiz gerekebilir.
Örneğin; kullanıcı sisteme ürünün fiyatını girmek istiyor. Bu durumda kullanıcı bazlı hataların önüne geçmek için programımızın ara yüzünde bazı kısıtlamalar yapmamız gerekmektedir. Çünkü kullanıcı bu alana alphanumeric bir değer girdiğinde ve veritabanına bu değer gönderdiğinde program patlayacaktır.
Kullanıcı girişinde kısıtlamayı yapabilmek ve hataların önüne geçebilmek için Regex fonksiyonunu kullanabiliriz. Bu fonksiyon sayesinde girilen karakterler, alan formatımıza uygun mu yoksa değil mi bunun kontrolünü yapabiliyor ve gelen sonuca göre aksiyon alabiliyoruz.
Bu işlemi DevExpress.XtraEditors.TextEdit kontrolü için yapacağız.
TextEdit’ in KeyPress event ini tıklıyoruz.
Bu Event içerisinde ben oluşturduğum Sub’ ları kullandım.
Öncelikle; oluşturduğum ilk Sub imda InStr() fonksiyonunu kullanıyorum.
InStr : Kelimenin, cümlenin veya sayının içerisinde bir karakter veya karakter dizisi aratmamızı ve aratmış olduğumuz karakterin var olup olmadığını var ise kaçıncı haneden itibaren başladığını verir.
Kullanımı: InStr(Kaçıncı karakterden itibaren aramaya başlanacak, nerde aranacak, ne aranacak? )
Örnek Kod:
InStr(1, e.KeyChar, “‘”) Or InStr(1, e.KeyChar, “:”) Or InStr(1, e.KeyChar, “;”)
Bu sayede “’”,”:” ve “;” girişlerini engelliyoruz.
Daha sonra ise Regex() fonksiyonunu kullanıcağız.
Örnek tanımlama:
Dim intRegexPattern As New _
System.Text.RegularExpressions.Regex(“^[0-9]”)
If Not intRegexPattern.IsMatch(e.KeyChar) Then
e.Handled = True
End If
Dim intRegexPattern As New _
System.Text.RegularExpressions.Regex(“^[0-9]”)
Dim chrRegexPattern As New _
System.Text.RegularExpressions.Regex(“^[.,]”)
Dim bsRegexPattern As New _
System.Text.RegularExpressions.Regex(“\b”)
If Not chrRegexPattern.IsMatch(e.KeyChar) And Not intRegexPattern.IsMatch(e.KeyChar) And bsRegexPattern.IsMatch(e.KeyChar) Then
e.Handled = True
End If
Para değeri girişini kontrol etmek için yazılmış örnek uygulama;
Bu uygulama kodu ile birlikte Regular Expression ( RegEx()) fonksiyonu geçerli bir para değeri verisi girilmesini dolaylı yoldan sağlayacak. Bu sayede veri; grup ayırıcı sembollerini, para birimi sembollerini, ayırıcıları, ondalıklı sayı ayırıcılarını ve negatif- pozitif sayı sembollerini içermeyecek.
Private Sub SimpleButton1_Click(sender As System.Object, e As System.EventArgs) Handles SimpleButton1.Click
Dim nfi As NumberFormatInfo = NumberFormatInfo.CurrentInfo
Dim pattern As String = “”
pattern = “^\s*[”
‘ Pozitif veya Negatif işaret sembollerini getirmemek için gerekli pattern.
pattern += Regex.Escape(nfi.PositiveSign + nfi.NegativeSign) + “]?\s?”
‘ Para birimi sembollerini getirirmemek için gerekli pattern.
pattern += Regex.Escape(nfi.CurrencySymbol) + “?\s?”
‘ Tam sayı örneği.
pattern += “(\d*”
‘ Decimal sayı ayıraçı kontrolü yapan pattern
pattern += Regex.Escape(nfi.CurrencyDecimalSeparator) + “?”
‘ Kesirli sayı.
pattern += “\d{”
‘ Para biriminin kesirli sayının numarasını belirler..
pattern += nfi.CurrencyDecimalDigits.ToString() + “}?){1}$”
Dim rgx As New Regex(pattern)
Dim tests() As String = {“-42”, “19.99”, “0.001”, “100 USD”, _
“.34”, “0.34”, “1,052.21”, “$10.62”, _
“+1.43”, “-$0.23”}
‘ Regular Expression la belirttiğimiz pattern( örnek ) leri baz alarak, her bir test değerini kontrol eder.
Dim lst_Reply As New List(Of String)
For Each test As String In tests
If rgx.IsMatch(test) Then
lst_Reply.Add(“{0} is a currency value.” & test)
Else
lst_Reply.Add(“{0} is not a currency value.” & test)
End If
Next
For i = 0 To lst_Reply.Count – 1
ListBox1.Items.Add(lst_Reply(i).ToString())
Next
End Sub