Standaard operators in .NET – Deel 2

Dit is een reeds eerder gepubliceerde post van de vorige VBcentral website door Arjan van Huizen

Ik vervolg mijn serie van artikelen over operators in .NET met deze keer aandacht voor bewerkingen op getallen. Het eerste artikel over String Operators vindt u hier.

 VB6 VAL functie

Stel dat een waarde de volgende reeks bevat: ‘ 15 februari ’ en je wilt alleen het nummer eruit filteren dan kon dat met de VAL(waarde) functie in VB6. In .NET bestaat deze nog steeds in de VB NameSpace maar daarbuiten niet. In .NET moeten we daar zelf een stukje code voor bouwen. In het code voorbeeld eerst de VAL functie en daarna een .NET alternatief.

 

 
 Private Sub Button7_Click(sender As System.Object, e As System.EventArgs) Handles Button7.Click  
 
 'Retourneer numerieke waarde(s) uit een tekenreeks   
 
 Dim s As String = " 15 februari "  
 
 'VB6 methode:  
 MessageBox.Show(VB6.Val(s).ToString)  
  
 
 'VB.NET methode: 
  Dim getal As String = ""  
 
  'We loopen door de tekenreeks heen en vergelijken op karakter (Char) niveau of het een getal betreft.  
  'Zie dat we de > < tekens kunnen gebruiken op een Char en eigenlijk een cijfer vergelijken!  
  For Each value As Char In s 
     If value >= "0" And value <= "9" Then 
         getal &= value 
     End If  
 
  Next  
  MessageBox.Show(getal) 
  End Sub 



RegEx functies

Dit is slechts één van de vele manieren. Een andere manier is het gebruiken van een RegEx expressie. Voor het kunnen gebruiken moeten we wel een Imports doen van de juiste NameSpace bovenaan onze code:

 
 Imports System.Text.RegularExpressions 


In onderstaande code filteren we de getallen uit de reeks en vervangen de overige tekens met een lege String “”

 
 Dim resultaat, s As String  
 
 s = " +31 (0)10-123 4567 "  
 
 Try  
 
     Dim RegexObj As New Regex("[^\d]")  
      
     'Vervangen van non-digits met een lege tekenreeks.   
      
     'Het ^ betekent inversie van de controle, de d staat voor alle digits van 0-9  
      
     'Bij het weglaten van het ^ karakter blijven alleen de vreemde tekens over zoals + ( ) en -  
      
     resultaat = RegexObj.Replace(s, "")  
      
     MessageBox.Show(resultaat)  
 
  Catch ex As ArgumentException  
 
      'Fout in de regular expression  
 
  End Try 


In het vorige voorbeeld filteren we de getallen uit een tekenreeks. We kunnen ook een vergelijking doen op een tekenreeks en controleren of er wel getallen in voorkomen. Daarvoor maken we weer gebruik van een RegEx functie en ditmaal van de IsMatch methode. 
Dit keer maken we niet gebruik van inversie (^ karakter) omdat we willen weten of de cijfers 0 t/m 9 erin voor komen en niet willen uitsluiten. 
 
 Dim s As String  
 
 s = " +31 (0)10-123 4567 "  
 
  
 
 Try 
     Dim RegexObj As New Regex("[\d]")   
      
     If RegexObj.IsMatch(s) Then  
      
         MessageBox.Show("De tekenreeks bevat 1 of meerdere cijfers")  
      
     Else  
      
         MessageBox.Show("De tekenreeks bevat geen cijfers")  
      
     End If    
 
  Catch ex As ArgumentException  
 
    'Fout in de regular expression  
 
End Try 


Voor verdere studie van de RegEx functies verwijs ik nu graag naar de website: www.regexlib.com

Converteren – Convert.To functies

Het converteren van een waarde naar een ander data type ging voorheen met o.a. de VB6 functies CInt, CDec etc. In .NET zijn daar een aantal nieuwe functies voor bijgekomen. Te weten Convert.ToInt32, Convert.ToDecimal, Convert.ToDouble etc. 
Een voorbeeld voor het converteren van een geheel Integer getal naar een Double (komma getal):
 
 'Converteren van een geheel Integer getal naar een Double  
  
Dim GetalInt As Integer = 100  
  
Dim GetalDouble As Double   
  
 GetalDouble = Convert.ToDouble(GetalInt) 


Het converteren van een getal naar een ander getal zal wel lukken, het ergste wat er kan gebeuren is dat je een komma getal naar een geheel getal converteert en er afronding zal plaatsvinden. Dit is natuurlijk niet gewenst en zal geen foutmelding opleveren. Hier moet je dus wel erg in houden. Voorbeeld waarbij het getal 1,5 omgezet wordt naar 2! Wel handig als het je salaris betreft..

 
GetalDouble = 1.5  
 
GetalInt = Convert.ToInt32(GetalDouble) 


Maar wat nu als het getal als een tekst aangeleverd wordt zoals dat vaak bij Controls als TextBoxen op een Form het geval is? Dat kan ook en gaat op dezelfde manier:

 
'Converteren van een tekst naar een getal   
Dim s As String = "55"  
  
Dim Getal As Integer  
  
Getal = Convert.ToInt32(s) 


Controle of conversie van tekst naar getal mogelijk is – TryParse

Maar de input kan ook echte tekst bevatten of andere tekens en dat geval krijgen we een FormatException. Spaties worden overigens genegeerd, maar andere tekens niet. Hoe lossen we dat dan op? Daarvoor dienen we eerst te controleren of de input tekst wel te converteren is naar een Integer of ander DataType zoals een Double of Decimal. Daarvoor maken we gebruik van de TryParse functie.

 
'Controle van de conversie van een tekst naar een getal  
 
Dim s As String = " 55 "  
 
Dim intGetal As Integer  
 
  
 
If Integer.TryParse(s, intGetal) Then  
 
    'TryParse is gelukt. Retourneert True  
     
    intGetal = Convert.ToInt32(s)  
     
    MessageBox.Show _  
     
     (String.Format("De reeks bevat alleen het cijfer: {0} en is veilig te converteren.", intGetal))  
     
Else      
    'Niet gelukt. Retourneert False     
    MessageBox.Show("De reeks bevat ook tekst")      
End If 


Parse versus Convert.To

Zoals we gezien hebben kunnen we met de Convert.To… functies, een getal omzetten naar een ander DataType zoals van een Integer naar een Double. Met Integer.Parse(argument) kunnen we dat ook. Maar wat is dan het verschil? Daarvoor moeten we het zoeken in het feit dat een Convert.To functie kan omgaan met de situatie als het argument leeg is, oftewel NULL bevat. Een Parse functie kan dat niet en zal een Exception tonen. Voer het onderstaande voorbeeld uit en zie het verschil.

 
 
'Convert.ToInt versus Integer.Parse  
Dim s As String  
 
'Een object kan de waarde NULL bevatten, een Integer standaard niet tenzij we die Nullable maken  
Dim intObject As Object   
 
'Convert.ToInt  
intObject = Convert.ToInt32(s) 'Retourneert 0   
 
'Parse  
intObject = Integer.Parse(s) 'Retourneert een ArgumentNullException. s kan niet NULL zijn 
 



In de voorbeelden hebben we alleen conversies gedaan op een Integer en Double maar er zijn nog veel meer mogelijkheden. Type maar eens Convert.To en Intellisense in Visual Studio zal alle opties laten zien. In het volgende artikel uit deze reeks gaan we verder met Date en Time functies. Bij vragen of opmerkingen kunt u commentaar achter laten. Bedankt!

-Arjan van Huizen-


 

Nieuwsbrief

Blijf op de hoogte van alles wat op VBcentral gebeurd. Meld je nu aan voor onze nieuwsbrief! »

Over ons

Wij zijn gek op het Microsoft .NET ontwikkelplatform en haar ontwikkeltalen, maar we hebben een sterke voorkeur voor Visual Basic .NET! »

Neem contact op

VBcentral.nl
Bataafseweg 20
7101 PA Winterswijk
Nederland
+31 (543) 538 388
info@vbcentral.nl