Gå til innhold

Desimaltall i kalkulator?


Anbefalte innlegg

Jeg har lagd en enkel kalkulator, men jeg får omtren en millioon desimaltall, hvordan kan jeg begrense dette. Gjerne et eksemplel.

 

Jeg lurer også på hvordan jeg kan gi en feilmelding hvis den skrives inn tekst istenen for tall. Takk for alle svar.

Lenke til kommentar
Videoannonse
Annonse

Du kan begrense antall desimaltall med Round-funksjonen:

 

Dim dValue As Double

' Begrens til to desimaler
dValue = Round(txtNumber.Text, 2)

 

Når det gjelder å umuliggjøre inntasting av annet enn tall, finnes det flere metoder. En metode, kan hende den enkleste, er å sette Locked til True og bruke ymse kommandoknapper til å legge til tall og tegn, likesom calc.exe.

 

En annen måte er å bekrefte gyldigheten av inntastingen fortløpende:

 

Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

' For å finne det lokale desimaltegnet
Const LOCALE_SMONDECIMALSEP = &H16
Const LOCALE_USER_DEFAULT = &H400

' Desimaltegn
Dim sDecimal As String

' Siste markørposisjon
Dim lLastPos As Long

' For å forhindre uønsket kjøring av hendelsen
Dim bIgnoreEvent As Boolean

Private Sub Form_Load()

   Dim Ret As Long

   ' Alloker nok plass
   sDecimal = Space(255)
   
   ' Finn desimaltegn
   Ret = GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SMONDECIMALSEP, sDecimal, Len(sDecimal))
   
   ' Vi trenger ikke ta mer enn hva som er nødvendig
   sDecimal = Left(sDecimal, Ret - 1)

End Sub

Private Sub txtNumber_Change()

   Dim sNumberic As String

   If bIgnoreEvent Then
       ' Ignorer denne
       Exit Sub
   End If

   ' Fjern alt unntatt tall og desimaltegn
   sNumberic = ConvertNumberic(txtNumber.Text)
   
   If Not txtNumber.Text = sNumberic Then
   
       ' Vi må så absolutt ikke reagere på tekstendringen neste gang den kjører
       bIgnoreEvent = True
   
       ' Tilbakestill inntastingen
       txtNumber.Text = sNumberic
       
       ' Idet dette medfører at markøren blir nullstilt, må vi tilbakestille dette òg
       txtNumber.SelStart = lLastPos
       
       ' Vi er ferdige
       bIgnoreEvent = False
       
   Else
       ' Lagre informasjon
       lLastPos = txtNumber.SelStart
       
   End If

End Sub

Public Function ConvertNumberic(sText As String) As String

   Dim Tell As Long, sChar As String, bDecimal As Boolean
   
   ' Gå gjennom hele strengen og returner kun tall og desimaltegn
   For Tell = 1 To Len(sText)
   
       sChar = Mid(sText, Tell, 1)
   
       If IsNumeric(sChar) Or (sChar = "." Or sChar = "," And (Not bDecimal)) Then
       
           ' Vi kan ikke ha mer enn et desimaltegn
           If sChar = "." Or sChar = "," Then
               bDecimal = True
           End If
           
           ' Returner tegnet
           ConvertNumberic = ConvertNumberic & sChar
           
       End If
   
   Next

End Function

Private Sub txtNumber_Click()

   ' Lagre markørposisjonen også når brukeren klikker
   lLastPos = txtNumber.SelStart

End Sub

Private Sub txtNumber_KeyDown(KeyCode As Integer, Shift As Integer)

   ' Samt når brukeren klikker på en tast
   lLastPos = txtNumber.SelStart
   
End Sub

 

En tredje metode er å sette Style i tekstboksen til ES_NUMERIC, men det er sannsynligvis uaktuelt her, idet tekstboksen da ikke vil akseptere desimaltall.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...