Avatar billede andersmd Nybegynder
15. november 2007 - 13:17 Der er 17 kommentarer

Kommatal i TextBox og TextBox du kun kan skrive tal i

Jeg er ved at prøve at lave et lille mattematik program, der kan udregne radius, diameter, areal og omkreds af en cirkel.
Der er fire TextBoxe en til radius, en til diameter, en til areal og en til omkreds.
Når du så skriver noget i en box regner programmet de andre tre ud, men man kan ikke skrive et kommatal i boxene.
Er der nogen der ved hvordan man kan gøre det?

Kan man også gøre så man ikke kan skrive bogstaver i en TextBox altså kun tal?
Avatar billede kalp Novice
15. november 2007 - 13:20 #1
Du kan skrive alle tegn og tekst du vil i en tekstboks, men du mener vel at du ikke kan lave en udregning med flere?

prøv at parse værdien i din textbox og gem i decimal :)
Avatar billede andersmd Nybegynder
15. november 2007 - 13:32 #2
Min kode ser sådan ud:(Det er lavet i Microsoft Visual Basic 2005 Express Edition)

Public Class Cirkel
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
        Dim vRadius As Integer
        Dim vDiameter As Integer
        Dim vAreal As Integer
        Dim vOmkreds As Integer

        vRadius = 0
        vDiameter = 0
        vAreal = 0
        vOmkreds = 0

        vRadius = TextBox1.Text
        vDiameter = vRadius * 2
        vAreal = vRadius * vRadius * 3.14
        vOmkreds = vDiameter * 3.14

        TextBox1.Text = vRadius
        TextBox2.Text = vDiameter
        TextBox3.Text = vAreal
        TextBox4.Text = vOmkreds
        Label5.Text = vRadius

    End Sub

    Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged
        Dim vRadius As Integer
        Dim vDiameter As Integer
        Dim vAreal As Integer
        Dim vOmkreds As Integer

        vRadius = 0
        vDiameter = 0
        vAreal = 0
        vOmkreds = 0

        vDiameter = TextBox2.Text
        vRadius = vDiameter / 2
        vAreal = vRadius * vRadius * 3.14
        vOmkreds = vDiameter * 3.14

        TextBox1.Text = vRadius
        TextBox2.Text = vDiameter
        TextBox3.Text = vAreal
        TextBox4.Text = vOmkreds
        Label5.Text = vRadius
    End Sub

    Private Sub TextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox3.TextChanged
        Dim vRadius As Integer
        Dim vDiameter As Integer
        Dim vAreal As Integer
        Dim vOmkreds As Integer

        vRadius = 0
        vDiameter = 0
        vAreal = 0
        vOmkreds = 0

        vAreal = TextBox3.Text
        vRadius = Math.Sqrt(vAreal / 3.14)
        vDiameter = vRadius * 2
        vOmkreds = vDiameter * 3.14

        TextBox1.Text = vRadius
        TextBox2.Text = vDiameter
        TextBox3.Text = vAreal
        TextBox4.Text = vOmkreds
        Label5.Text = vRadius
    End Sub

    Private Sub TextBox4_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox4.TextChanged
        Dim vRadius As Integer
        Dim vDiameter As Integer
        Dim vAreal As Integer
        Dim vOmkreds As Integer

        vRadius = 0
        vDiameter = 0
        vAreal = 0
        vOmkreds = 0

        vOmkreds = TextBox4.Text
        vRadius = vOmkreds / 3.14 / 2
        vDiameter = vRadius * 2
        vAreal = vRadius * vRadius * 3.14

        TextBox1.Text = vRadius
        TextBox2.Text = vDiameter
        TextBox3.Text = vAreal
        TextBox4.Text = vOmkreds
        Label5.Text = vRadius
    End Sub
End Class
Avatar billede kalp Novice
15. november 2007 - 13:33 #3
hvis vi tager den hurtigere så ret alle dine

Integer til Decimal
Avatar billede mikkel_sommer Nybegynder
15. november 2007 - 13:39 #4
Hvis du vil sikre dig at der kun kommer tal i din(e) textbox(e) kan det forholdsvis nemt gøres via javascript.
Avatar billede andersmd Nybegynder
15. november 2007 - 13:49 #5
Det virkede ikke med at rette alle Integer til Decimal.

Hvordam kan man så lave en textbox man kun kan skrive tal i i javascript???
Avatar billede mikkel_sommer Nybegynder
15. november 2007 - 13:59 #6
Noget i stil med:

function numberCheck(event, inputFieldObj, fieldFunction)
{
    var result = "";
    for(var i = 0; i < inputFieldObj.value.length; i++)
    {
        if(i < 4)
        {
            if(isNaN(inputFieldObj.value.substring(i,i+1)) && inputFieldObj.value.substring(i,i+1) != ",")
            {

            }
            else
            {
                result = result + inputFieldObj.value.substring(i,i+1);
            }
        }
    }
    inputFieldObj.value = result;
}

og i page_load:

TextBox1.Attributes.Add("onKeyUp", "return numberCheck(event, this, 'TextBox1')");

...hvis det er i TextBox1 der kun må være tal.

&& inputFieldObj.value.substring(i,i+1) != ",") - gør at det også er muligt at indtaste komma.
Avatar billede mikkel_sommer Nybegynder
15. november 2007 - 14:01 #7
Hov kan jo gøres lidt kortere med:

if(!isNaN(inputFieldObj.value.substring(i,i+1)))
            {
                result = result + inputFieldObj.value.substring(i,i+1);
            }

i stedet for if/else
Avatar billede mikkel_sommer Nybegynder
15. november 2007 - 14:03 #8
Ups du har jeg nok heller ikke brug for:

if(i < 4)
{
}

det var fordi jeg skulle sikre at der kun kunne indtastes 4 tal.
Avatar billede lord_mike Nybegynder
16. november 2007 - 00:23 #9
Uhm.. Det der er C# ...

VB:

Du bruger integers... Det er usmart af flere grunde...
1. Du vil have kommatal... Integers er hele tal...
2. Cirkler (Pi i det hele taget) giver aldrig kun hele tal...

Brug doubles:
TextBox1.TextChanged
    Dim vRadius As Double
    Dim vDiameter As Double
    Dim vAreal As Double
    Dim vOmkreds As Integer

    vRadius = 0
    vDiameter = 0
    vAreal = 0
    vOmkreds = 0

    vRadius = TextBox1.Text.Replace(",", ".")
    vDiameter = vRadius * 2
    vAreal = vRadius * vRadius * 3.14
    vOmkreds = vDiameter * 3.14

    TextBox1.Text = vRadius
    TextBox2.Text = vDiameter
    TextBox3.Text = vAreal
    TextBox4.Text = vOmkreds
    Label5.Text = vRadius
End Sub
------------------------
Grunden til at jeg bruger replace, er at .Net regner i engelsk format internt.. Ie. "." som kommatalsseperator.

Derudover, skal du passe på med at sætte textbox2, 3, 4 til noget. Eftersom at det sætter gang i eventen "Textchanged", som er den du bruger til at sætte dem med...

Dette giver en uendelig loop:
Værdi ændret
Sæt ny værdi
- Værdi ændret
- Sæt ny værdi
-- Værdi ændret
-- Sæt ny værdi
--- Værdi ændret
--- Sæt ny værdi

Håber det hjælper

Michael
Avatar billede lord_mike Nybegynder
16. november 2007 - 00:26 #10
Mht. Kun tal i en tekstbox...

Tjaa.. Du kan bruge "Keypress" eventen. Og tjekke om den ASCII værdi der blev indtastet er Større eller lig med 48 (0), og mindre eller lig med 57 (9).

Hvis den ikke er det, så sæt den til 0 (Null, ingen tekst, linjeskrift etc..... Ingenting)

Eks.

Select Case ASCIIVal
Case 48 To 57  '0-9
'Do nothing
Case asc(".")  'Period (.)
'Do nothing
Case Else
ASCIIVal = 0
End Select
Avatar billede lord_mike Nybegynder
16. november 2007 - 00:27 #11
Skulle lige huske at sige, at keypress's "ASCIIVal" som du kommer til at lege med, er ikke indtastet i selve programmet endnu.

Proceduren forgår sådan her:

Tastetryk (Fysisk)
Keypress
Avatar billede lord_mike Nybegynder
16. november 2007 - 00:28 #12
<--- Som jeg roder med
Indtastning af værdi i programmet... (Ændret værdi)

Obs:
Sorry for spam, er for hurtig til at trykke send...
Desuden mangler der en 'ret' knap....
Avatar billede lord_mike Nybegynder
16. november 2007 - 00:29 #13
Foreslår at du burger Math.PI... Den er mere præcis end "3.14"
Avatar billede mikkel_sommer Nybegynder
16. november 2007 - 08:32 #14
Det er rigtigt hvad lord_mike siger, du kan også anvende Keypress så skal du bare huske på at hver gang en tast bliver trykket ned ryger siden serverside.
Avatar billede lord_mike Nybegynder
16. november 2007 - 21:06 #15
Nu må jeg igen erklære mig uenig :P

Dette er VB.Net, i programmer... Ikke VB.Net (Sprog) i ASP.Net (Websider).
Det eneste man skal gøre... Er at tjekke om "e" (Som er eventen) er det man forventer.

Select Case Asc(e.Keychar)
  Case Asc(".")
  Case 48 To 57
  Case Else
    e.KeyChar = ""
End Select
Avatar billede mikkel_sommer Nybegynder
19. november 2007 - 08:30 #16
Forstår ikke helt hvad det er du erklærer dig uenig i, når din select køres er du da serverside, og du vil komme det hver gang en tast bliver trykket på.
Avatar billede lord_mike Nybegynder
19. november 2007 - 11:12 #17
Serverside referer til at du sender din request til en server som behandler og sender tilbage.

Server er i min opfattelse, en server som står hvorsomhelst i verden og behandler data, og ikke en klient som har et VB.Net program. VB.Net behandles jo som et Win32 program på selve maskinen den kører på...

@Andersmd:
Prøv at kigge på "Maskedtextbox". Har ikke selv kigget, men beskrivelsen antyder at det har noget at gøre med at du kan sætte en string som validator, hvorefter alt input skal valideres efter den string. Her vil jeg tro du kan skrive f.eks. "0123456789", hvorefter at man ikke kan skrive "abc..[..]"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester