1 juni Standaard operators in .NET – Deel 2 juni 1, 2017door Arjan van Huizen Visual Basic .NET Operators, RegEx 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-