Błąd z separatorem typu Double w ListBoxie

0

Cześć,

Mam problem ze skryptem w VBA. mam kilka textboxów, do których wpisuję liczby, a po zatwierdzeniu ich Buttonem dodają się one do ListBoxa. Gdy wpisuję liczby całkowite wszystko jest ok natomiast dziwna rzecz dzieje się gdy próbuję wpisać liczbę dziesiętną. Otóż:

  • Jeśli jako separator podaję przecinek, to albo wszystkie te przecinki wewnątrz ListBoxa zostają zamienione na kropkę, a program nie jest w stanie pracować z tymi kropkami i wywala się błąd tak jak w poniższym punkcie, albo od czasu do czasu (dosłownie, nie wiem co ma na to wpływ...) przecinki zostaną normalnie dodane do ListBoxa i nie zamienione na kropki, i wtedy program działa normalnie;
  • Jeśli jako separator podaję kropkę to program od ręki się wysypuję i dostaję błąd:
    screenshot-20220718150715.png

Co jest dla mnie tym bardziej dziwne. Przecież Double pracuje na kropkach, a nie przecinkach......
Poniższy kod, w skrócie, obsługuje przypisanie podanych w TextBoxach liczb jako item ListBoxa. Kod ten znajduje się wewnątrz procedury zdarzenia kliknięcia przycisku:

Dim x As Double
x = IIf(Len(XTextBox.Text) = 0, 0, XTextBox.Text)

Dim y As Double
y = IIf(Len(YTextBox.Text) = 0, 0, YTextBox.Text)

CoordListBox.AddItem x
CoordListBox.list(CoordListBox.ListCount - 1, 1) = y

XTextBox.Text = ""
YTextBox.Text = ""

Proszę Was o pomoc, bo szczerze nie mam pojęcia co się tutaj dzieje.

0
lysyZBieszczad napisał(a):

Co jest dla mnie tym bardziej dziwne. Przecież Double pracuje na kropkach, a nie przecinkach......

No nie.
We współczesnych językach programowania, w źródłach, chyba zawsze tak (wyjatki: jakieś Cobole, polskie wersje Lego itd) . I to jest ostatnie miejsce, gdzie na kropkę "można liczyć"".

Ale na interfejsie z użytkownikiem, podczas drukowania, przyjmowania wejścia - wszędzie tam, gdzie włącza się biblioteka standardowa języka - we wszystkich nowoczesnych językach spodziewaj się ustawienia dla danego kraju. Przecinek, separator tysięcy itd ... wszystkie chwyty dozwolone

Pewnie bym ci pomógł więcej, gdybym w najmniejszym stopniu mógł zgadnąć, co zamierzasz.
Prawie zawsze użycie elementów GUI jako kontenerów na dane - JEST ZŁYM SPOSOBEM.

0

te same komponenty GUI w wersji .NET maja składowa Tag, która właśnie jest przeznaczona do trzymania "czegoś"
Czy w wersji VBA - nie powiem

0

https://stackoverflow.com/questions/1172306/convert-string-to-double-vb

Przy konwertowaniu powinieneś brać zawsze pod uwagę CultureInfo.

Wyciąłem z tego linka

Public Shared Function GetDouble(ByVal doublestring As String) As Double
        Dim retval As Double
        Dim sep As String = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

        Double.TryParse(Replace(Replace(doublestring, ".", sep), ",", sep), retval)
        Return retval
    End Function

    ' NULLABLE VERSION:
    Public Shared Function GetDoubleNullable(ByVal doublestring As String) As Double?
        Dim retval As Double
        Dim sep As String = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

        If Double.TryParse(Replace(Replace(doublestring, ".", sep), ",", sep), retval) Then
            Return retval
        Else
            Return Nothing
        End If
    End Function

1 użytkowników online, w tym zalogowanych: 0, gości: 1