Springen naar inhoud


- - - - -
VS 2015

Hoe Om Te Gaan Met Komma En Aanhalingsteken In Een String

VS2015

  • Log in a.u.b. om te beantwoorden
Er zijn 4 reacties in dit onderwerp

#1 ronron

ronron

    Senior Developer

  • Leden
  • PipPipPip
  • 158 berichten
    Laatst bezocht 22 jan 2021 18:37
  • LocatieHaarlem

Geplaatst op 03 januari 2021 - 11:24

Zo af en toe kom ik tegen dat een gebruiker vastloopt omdat er een komma of een aanhalingsteken in een string is gebruikt Ben ik de enige of is hier een oplossing voor.
Heb een programma gemaakt dat door een paar mensen word gebruikt en heb hun verteld deze tekens niet te gebruiken. Soms word dit vergeten , en ik vind zelf dat een programma deze beperking niet mag hebben.
Ben benieuwd of ik de enige ben of dat dit al door iemand is opgelost

#2 ronron

ronron

    Senior Developer

  • Leden
  • PipPipPip
  • 158 berichten
    Laatst bezocht 22 jan 2021 18:37
  • LocatieHaarlem

Geplaatst op 03 januari 2021 - 13:05

Heb het zo voorlopig opgelost. Kan volgens mij beter

Naam = textbox1.text: Hulp = naam: Call Schoon: Naam = Hulp

Private Sub Schoon()
        Hulp = Replace(Hulp, ",", ".")    (Rem wijzig komma in punt)
        Hulp = Replace(Hulp, Chr(34), " ")    (Rem verwijder aanhalingstekens)

#3 Puffeltje

Puffeltje

    Senior Developer

  • Leden
  • PipPipPip
  • 135 berichten
    Laatst bezocht 20 feb 2021 00:02
  • LocatieBeverwijk

Geplaatst op 10 januari 2021 - 00:24

Zelf liep ik hier ook wel eens tegen aan als ik iets op moest slaan in een database. Niet geaccepteerde karakters verving ik dan door een stukje tekst wat wel geaccepteerd werd maar wat bijna nooit door een gebruiker ingevoerd zou worden. Een aanhalingsteken veranderde ik dan in bijvoorbeeld '#$%JP1'. Dit werd dan keurig opgeslagen in de database. Als de database uitgelezen werd en de items getoond moesten worden werd de tekst '#$%JP1' weer terug veranderd naar het aanhalingsteken.
De volgende 'ongeldige' invoer van een gebruiker verving ik dan door '#$%JP2'.

Ik geef toe, niet echt een mooie oplossing maar was voor mij op dat ogenblik wel een goed bruikbare. Ik deed het richting een database maar je kan dit natuurlijk ook toepassen op variabelen.

#4 Supervos

Supervos

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1421 berichten
    Laatst bezocht 01 mrt 2021 11:53
  • LocatieBrugge

Geplaatst op 18 januari 2021 - 16:20

Er is altijd de vraag wat de betekenis is van een string en waaraan deze moet voldoen. Er zijn meerdere oplossingen mogelijk en meerdere oorzaken waarom een teken niet is toegestaan.

Zo mag de naam van een bestand bepaalde tekens niet bevatten, zoals de "/" of "\". Je kan 2 dingen doen als je dit tegenkomt: ofwel controleer je en geef je een melding aan de gebruiker dat er tekens bestaan die niet toegestaan zijn (een andere lijst kan je vinden in https://docs.microso...nvalidpathchars).
Voor een string naar een database te sturen werk je het best met prepared statements of database parameters. Hiermee pak je de string in in iets anders dat veilig is voor je database. De methode die Puffeltje voorstelt kan eventueel maar is niet aangeraden.
Voor een string die een getal bevat moet je weten of het een kommagetal is of niet, en wat de gebruiker heeft ingesteld als scheidingsteken voor de komma.
Voor een string die een datum bevat is dit ook afhankelijk van wat de gebruiker heeft ingesteld, is het scheidingsteken een "/" of een "-", is het "dag/maand/jaar", "maand/dag/jaar", "jaar-maand-dag" of nog iets anders.

Er zijn zodanig veel mogelijkheden en bedoelingen dat dit niet universeel kan worden gemaakt.

Het vastlopen van een programma is uiteraard niet gewenst. Je kan dit echter oplossen door alle input die je krijgt eerst te controleren, als deze in orde is geef je dit door naar de rest van de code, is dit niet geldig geef je een melding aan de gebruiker en stop je met de rest van je code. Hiervoor zijn er meerdere mogelijkheden, zeker voor omvormen naar getal of een datum kan je gebruik maken van de TryParse methodes, hier een voorbeeld:
Code:
Public Sub OkClick(sender As Object, e As EventArgs) Handles Ok.Click
  Dim datum As DateTime
  If Not DateTime.TryParse(txtDatum.Text, datum) Then
	MessageBox.Show("De datum is niet goed, probeer opnieuw")
	txtDatum.Focus()
	Return
  End If

  VerwerkDatum(datum)
End Sub


Je kan ook in je code alles door een try-catch omgeven maar dit raad ik niet aan, het zorgt er voor dat sommige fouten minder zichtbaar worden (omdat ze worden ingeslikt) en je programma in sommige gevallen onvoorspelbaar begint te worden (bijvoorbeeld je haalt een waarde op uit de database, werkt verder op die waarde en schrijft het weg naar een bestand, als het ophalen uit de database mislukt kan je verder werken op een standaard waarde, wat verder voor extra problemen kan zorgen).
Persoonlijk ben ik voorstander om op het hoogste niveau (knop klik) de invoer waarden te controleren en daar ook een foutopvanging te doen. Al de rest van je code doet zo weinig mogelijk try-catch (enkel als je weet dat een specifieke fout kan gebeuren en hoe je deze kan opvangen/herstellen, vang ook specifieke fouten op, niet de algemene Exception). Het is dan aan het hoogste niveau om te beslissen om een (gepaste) melding te tonen aan de gebruiker.

#5 ronron

ronron

    Senior Developer

  • Leden
  • PipPipPip
  • 158 berichten
    Laatst bezocht 22 jan 2021 18:37
  • LocatieHaarlem

Geplaatst op 22 januari 2021 - 18:38

Bedankt voor de uitleg





Ook met taq VS 2015, VS2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan J├╝rgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)