logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak zamienić tekst z TextBox1 na liczbę dziesiętną w kodzie?

Facetjanusz 19 Sty 2014 16:16 3084 14
REKLAMA
  • #1 13195022
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Witam
    W celu zamiany Wartości liczbowej w TextBox1 (wartość jest wpisywana jako tekst) na cyfry stosuję mnożenie - TextBox1*1. Działa tylko wówczas gdy w TextBox1 jest liczba całkowita. Gdy jednak znajduje się liczba dziesiętna leci błąd. Mam prośbę - mianowicie jakim kodem zmienić liczbę z częściami dziesiętnymi.
    Pozdrawiam
    [/i]
  • REKLAMA
  • Pomocny post
    #2 13195122
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Nie napisałeś ani jaki język programowania - ani nie podałeś przykładowego kodu, więc jak ktokolwiek może ci odpowiedzieć?

    P.S. Błędy nie ptaki - nie "latają".
  • REKLAMA
  • #3 13195747
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Językiem programowania jest EXCEL VBA. Stosowałem także kod, który działa mi w innym programie, ale w tym niestety nie.
    Spoiler:
    Cells(Wiersz_ost, 6).Value = IIf(CSng(.TextBox1.Value) = 0, "", CSng(.TextBox1.Value))

    i nie wiem dlaczego.
    Przy liczbach całkowitych wystarczy taki kod:
    Spoiler:
    TextBox1*1.

    Pozdrawiam
  • Pomocny post
    #4 13195771
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Zamień przecinek (występujący jako separator dziesiętny) na kropkę (funkcja Replace) przed zmianą tekstu na zmienną liczbową.
  • REKLAMA
  • #5 13195963
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Dziękuję mickpri za zainteresowanie się moim problemem. W tabelce wpisuję wartości w 9-ciu kontrolkach TextBox. Kiedy zachodzi konieczność sumowania z sobą niektórych muszę je wcześniej zamienić na wartości. Jeżeli wartość kontrolki ma liczbę z przecinkiem to nie wystarczy wcześniej zamienić je mnożąc przez jeden. Proponujesz zmienić przecinki na kropki - tylko jak to zmienić we wszystkich kontrolkach Text Box na raz?
    Jak zamienić tekst z TextBox1 na liczbę dziesiętną w kodzie?
  • Pomocny post
    #6 13196621
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Facetjanusz napisał:
    Proponujesz zmienić przecinki na kropki - tylko jak to zmienić we wszystkich kontrolkach Text Box na raz?
    Można:
    1) Do każdej z nich dodać metodę onChange/onUpdate zmieniającą przecinek na kropkę (taka zmiana obejmuje zmiany "programowe", czy też ręczne więc to nie ma znaczenia)
    lub też (lepiej)
    2) Zmianę wykrywać wyłącznie w kodzie korzystających z wprowadzonych wartości. Przecież nie jest to jakieś skomplikowane.
  • #7 13199065
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Przedstawię programik który obrazuje wymienione problemy.
    Pozdrawiam
    Załączniki:
    • Wp__aty.rar (26.62 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 13201935
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Chciałbym dodać, że ten programik nie działa tak do końca sprawnie, dlatego prosiłbym o pomoc w kilku kwestiach. Po pierwsze okienko informacyjne pojawia się na drugim planie, z powodu :TextBox2.SetFocus,. Po drugie - Jeżeli w kontrolki TextBox wpisuję liczby całkowite, oraz procent z tych liczb będzie liczbą całkowitą wówczas liczy dobrze. Jeżeli w kontrolkach znajdą się liczby z ułamkiem powstaję błąd.
    Jeszcze raz proszę o poprawę.
    Pozdrawiam
  • Pomocny post
    #9 13206129
    marek003
    Poziom 40  
    Posty: 4604
    Pomógł: 799
    Ocena: 484
    Proponuję wcześniej sprawdzać czy wpisana dana jest numeryczna i to załatwi sprawę.
    Dodatkowo po obliczeniach zamieniałbym obliczoną daną na string gdyż wtedy pokazywać będzie wartość liczbową po polsku czyli z przecinkiem
    Proponuje zmienić kod pod txt3 na

    Kod: text
    Zaloguj się, aby zobaczyć kod


    i analogicznie dla txt5.

    i jeszcze wyłączył bym do edycji (enabled=false) okienka z wynikami vatu by nikt nie zmienił z ręki wartości a by były tylko widoczne

    Masz jeszcze błąd przy wyniku (przycisk OK) bo jak txt3 jest puste to bug (brak if'a)

    Nie rozumiem do końca opcji z wyskakującym okienkiem.


    ---------------
    dodane po chwili
    ---------------

    kolejny błąd
    wszystkie zmienne "W" są typu integer więc obcina wartości po przecinku.

    I następny mankament VB: "Round"
    Uważaj bo amerykanie inaczej zaokrąglają :) . To co dla nas jest normalne nie koniecznie dla funkcji round.

    Wprowadź a zobaczysz:
    1,5 *23% = 0,345 czyli w Polsce 0,35
    2,5*23%=0,575 czyli 0,58
    a zobacz co pokazuje VB i znajdź konsekwencję :)
    Proponuje zaokrąglać nietypowo poprzez "format" ale wtedy jest "po polsku".


    ---------------
    tu ze strony Microsoftu o round w VB:

    ' 2.125 --> 2.12
    ' 2.135 --> 2.13
    ' 2.145 --> 2.14
    ' 3.125 --> 3.12
    ' 3.135 --> 3.14
    ' 3.145 --> 3.14
    Tłumaczą tio tak:
    Dzieje się tak, ponieważ wewnętrznie mnoży metoda value o 10cyfr, a w tym przypadku operacja mnożenia odczuwa utratę precyzji.

    to "cyfr" w powyższym to potęga 10.

    Ale jak złapać konsekwencję? Czy w ogóle się da?
  • REKLAMA
  • #11 13207212
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Palący problem rozwiązałem za pomocą kodu który zamienił na liczbowe wartości.
    Spoiler:
    If TextBox1 <> "" Then
    W1 = CDbl(Replace(TextBox1.Value, ".", ",")) ' * 1
    End If

    Natomiast zamiast okienka informacyjnego użyłem Label1.
    Spoiler:
    With Label7
    .Visible = True
    .BackColor = &HFFF00
    End With

    Dziękuję za pomoc i
    Pozdrawiam
  • Pomocny post
    #12 13207247
    marek003
    Poziom 40  
    Posty: 4604
    Pomógł: 799
    Ocena: 484
    mickpr napisał:
    Pewnie, że się da.


    Cytat z tekstu:
    „Połówki” zaokraglane tu są raz w górę, a raz w dół, zawsze do najbliższej liczby parzystej.

    :) to jak się ma ten "wyjątek":

    marek003 napisał:

    tu ze strony Microsoftu o round w VB:

    ' 2.125 --> 2.12
    ' 2.135 --> 2.13
    ' 2.145 --> 2.14
    ' 3.125 --> 3.12
    ' 3.135 --> 3.14
    ' 3.145 --> 3.14

    Ja bym za mocno nie szukał konsekwencji. :)
    No chyba że jest jeszcze jakaś zasada. :)

    Dodano po 2 [minuty]:

    Facetjanusz napisał:
    Palący problem rozwiązałem za pomocą kodu który zamienił na liczbowe wartości.
    Spoiler:
    If TextBox1 <> "" Then
    W1 = CDbl(Replace(TextBox1.Value, ".", ",")) ' * 1
    End If


    Tylko że jak przez przypadek wpiszesz literę znów wyskoczy bug.
  • #13 13207401
    mickpr
    Poziom 39  
    Posty: 4630
    Pomógł: 579
    Ocena: 295
    Opisywane przez ciebie problemy z zaokrągleniem wynikają z niedokładności wynikającej z samej implementacji liczb zmiennoprzecinkowych ORAZ sposobu ich zaokrąglania.

    Przykładowo - jeśli zaokrąglamy 2.135 do 2 miejsc po przecinku - najpierw liczba ta mnożona jest przez 10^N gdzie N= ilość cyfr po przecinku.
    Z powodu niedokładności implementacji liczb zmiennoprzecinkowych - wartość ta nieco odbiega od 213.5 a wynosi około 213.49999999999997
    A to już jest mniej niż 213.5 - więc powstaje 213.4 (po podzieleniu przez 100 -> 2.13)

    Ot cały problem.
    Dla "statystyka" - kaine probleme.
    Dla kogoś (jak ja) kto obliczał np. opłaty za wodę i CO - takie "urywane grosiki" stanowiły kiedyś problem.
    Należy wspomnieć, że w Excel-u sprawę załatwia ZAOKR (poprawnie) i jego różne mutacje.
    W VBA - najlepiej do celów obliczeń kwot użyć zmiennych decimal http://msdn.microsoft.com/pl-pl/library/xtba3z33.aspx unikamy wtedy używania liczb zmiennoprzecinkowych.

    http://msdn.microsoft.com/pl-pl/library/system.math.round.aspx#Precision
  • Pomocny post
    #14 13207444
    marek003
    Poziom 40  
    Posty: 4604
    Pomógł: 799
    Ocena: 484
    Nie chcę ciągnąć bo to nie temat główny wątku, ale wg mnie nie mamy wpływu (no chyba że się nauczymy na pamięć) na "niedokładności implementacji cyfr zmiennoprzecinkowych" w związku z tym przy zaokrąglaniu za pomocą Round() nadal nie szukał bym konsekwencji.
    :) Ale już się poddaje, tym bardziej widząc nad awatarem "Moją specjalnością jest upór" :)

    Również uważam że należy pracować na innych zmiennych lub w VB stosować format() zamiast round()
  • #15 13210302
    Facetjanusz
    Poziom 15  
    Posty: 229
    Ocena: 22
    Dzięki koledzy za pomoc, ale ja nie będę zagłębiał się w tą tematykę - wystarczy, że program działa mi poprawnie.
    Pozdrawiam

Podsumowanie tematu

✨ Użytkownik poszukiwał sposobu na konwersję wartości liczbowych z TextBox1 w VBA Excel z formatu tekstowego na liczby dziesiętne. Początkowo stosował mnożenie przez 1, co działało tylko dla liczb całkowitych. Otrzymał sugestię, aby zamienić przecinki na kropki jako separator dziesiętny przed konwersją. W odpowiedziach zaproponowano dodanie metod onChange/onUpdate do kontrolek TextBox, aby automatycznie zmieniać przecinki na kropki. Użytkownik zademonstrował problemy z zaokrąglaniem i błędami przy wprowadzaniu danych, a także z wyświetlaniem okienek informacyjnych. Ostatecznie udało mu się rozwiązać problem, zmieniając sposób konwersji na wartości liczbowe i używając Label1 zamiast okienka informacyjnego.
Wygenerowane przez model językowy.
REKLAMA