programowanieProgramista aplikacji biznesowych, inżynier ERP/CRM

Jak realizowane jest przetwarzanie ciągów wejściowych użytkownika i sprawdzanie wejścia numerycznego w Visual Basic? Na co zwracać uwagę przy konwertowaniu ciągów na liczby?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

W Visual Basic dane często są wprowadzane przez użytkownika jako ciągi (na przykład przez TextBox lub InputBox), jednak w celu dalszej pracy wymagane jest ich przekształcenie w typy numeryczne. We wcześniejszych wersjach VB stosowano luźne przekształcenie przez Val lub CInt, co prowadziło do oczywistych i nieoczywistych błędów przy niepoprawnych danych. Zakładano, że ciąg zawsze zawiera poprawną wartość, lecz w praktyce użytkownicy wprowadzają błędne znaki, co powoduje błędy lub niepoprawne przekształcenia.

Problemem jest brak ochrony przekształcenia, prowadzący do awarii aplikacji lub błędnych obliczeń. Na przykład, Val("1a") zwróci 1, co może być niespodziewane. Użycie TryParse i ścisła weryfikacja formatu wejścia pozwala uniknąć takich błędów i poprawnie przetwarzać dane wejściowe.

Rozwiązaniem jest zastosowanie metody Integer.TryParse (lub Double.TryParse itd.), która zwraca True tylko w przypadku udanego przekształcenia.

Przykład kodu:

Dim input As String = TextBox1.Text Dim value As Integer If Integer.TryParse(input, value) Then ' Wprowadzono poprawną liczbę, zmienna value zawiera wartość Else MessageBox.Show("Proszę wprowadzić liczbę całkowitą") End If

Kluczowe cechy:

  • TryParse bezpiecznie obsługuje błędy, nie zgłasza wyjątków
  • Val i CInt nie nadają się do danych użytkownika bez weryfikacji
  • Ważne jest uwzględnienie lokalizacji (separatorów dziesiętnych), używać odpowiednich przeciążeń TryParse

Pytania z lukami.

Jakie są zagrożenia związane z funkcją Val przy przetwarzaniu wejścia od użytkownika?

Val zwraca wartość numeryczną do pierwszego niepoprawnego znaku i nie zgłasza błędu, co może prowadzić do niepoprawnej logiki.

Dim n = Val("12abc") ' Zwróci 12, chociaż ciąg jest niepoprawny

Jaka jest różnica między CInt a Integer.Parse?

CInt wykonuje zaokrąglanie zgodnie z zaokrąglaniem bankowym, a Integer.Parse wymaga dokładnego dopasowania ciągu do liczby i zgłasza wyjątek w przypadku błędu.

Dlaczego TryParse nie zawsze zwraca True dla ciągu "1,234"?

Wynik zależy od ustawień regionu Windows: gdzieś separatorem dziesiętnym jest przecinek, gdzie indziej kropka. Ważne jest, aby wyraźnie określić format:

Dim number As Double Double.TryParse("1,234", NumberStyles.Any, CultureInfo.InvariantCulture, number)

Typowe błędy i antywzorce

  • Użycie Val lub bezpośrednie przekształcenie bez weryfikacji
  • Ignorowanie ustawień regionalnych
  • Pomijanie sprawdzania danych uzyskanych z TextBox lub InputBox

Przykład z życia

Negatywny przypadek

Moduł finansowy przyjmował dane przez InputBox, przekształcał przez Val, suma 10,5 stawała się 10 w niektórych przypadkach (przecinek nie był rozpoznawany, a kropka nie była wprowadzana).

Zalety:

  • Mało kodu, wygląda prosto

Wady:

  • Utrata danych, błędy w obliczeniach

Pozytywny przypadek

Przejście na TryParse z uwzględnieniem ustawień kulturowych i walidacji pola wejściowego.

Zalety:

  • Gwarancja poprawności liczby
  • Proste wyświetlenie komunikatu dla użytkownika, jeśli dane są niepoprawne

Wady:

  • Wymaga więcej kodu, wymagana obsługa błędów i określenie kultury w razie potrzeby