Avatar billede jesperbaldur Nybegynder
13. februar 2003 - 14:21 Der er 9 kommentarer og
1 løsning

Tjekke om det er et tal

Jeg har en variabel str som indeholder en værdi. Den konverterer jeg så om til en double. Men hvordan tjekker jeg om str indeholder tal, fx str = df, str= 12f4 osv
Avatar billede disky Nybegynder
13. februar 2003 - 14:58 #1
du kan undersøge alle tegn om de er .isDigit(), eller du kan bruge

Double.parseDouble(DinString);

med en try/catch der fanger den exception der kommer hvis det ikke er et tal.

Den første er pænest.
Avatar billede jesperbaldur Nybegynder
13. februar 2003 - 15:10 #2
Hvis jeg værlger at bruge .isDigit() skal jeg så undersøge alle tegn hver for sig, altså hvis str="hj45" skal den så først undersøge h og derefter j osv. Eller kan den godt undersøge hele strengen ?
Avatar billede disky Nybegynder
13. februar 2003 - 15:14 #3
Her er et eksempel der viser de 2 forskellige metoder, ulempen ved den pæne metode, er at man skal checke alle tegn, og også checke for '.' og/eller ',' afhængig af hvilket sprog man kører på maskinen.



/**
* Created by IntelliJ IDEA.
* User: sreinke
* Date: Feb 13, 2003
* Time: 2:57:49 PM
* To change this template use Options | File Templates.
*/
public class TalKonverter
{
    public static final int FEJL=-99999999;

    public TalKonverter()
    {
        String sTal1="2348.34";
        String sTal2="4475q.9";

        double tal1a=Konverter1(sTal1);
        double tal1b=Konverter2(sTal1);
        double tal2a=Konverter1(sTal2);
        double tal2b=Konverter2(sTal2);
        System.out.println("tal 1 fra Konverter1 = "+tal1a);
        System.out.println("tal 1 fra Konverter2 = "+tal1b);
        System.out.println("tal 2 fra Konverter1 = "+tal2a);
        System.out.println("tal 2 fra Konverter2 = "+tal2b);
    }

    private double Konverter2(String tal1)
    {
        char ch;
        for (int x=0;x<tal1.length();x++)
        {
            ch=tal1.charAt(x);
            if(!Character.isDigit(ch) && ch!='.')
            {
                return FEJL;
            }
        }
        return Double.parseDouble(tal1);
    }

    private double Konverter1(String tal1)
    {
        double resultat=FEJL;
        try
        {
            resultat=Double.parseDouble(tal1);
        }
        catch (NumberFormatException e)
        {
        }
        return resultat;
    }


    public static void main(String args[])
    {
        new TalKonverter();
    }
}
Avatar billede jesperbaldur Nybegynder
13. februar 2003 - 15:38 #4
ok jeg har fået det til at virke vha try catch. Men når den møder en streng som ikke er et tal skal den stoppe proceduren...Hvordan laver man det? I Visual Basic hedder det Exit Sub
Avatar billede disky Nybegynder
13. februar 2003 - 15:42 #5
Det gør denne her også, hvis den lander i catch() laver den ingen ting og returnerer derefter resultat som så er = FEJL, man bruger 'return' til at forlade en metode med.

Eller tænker du på i den metode som kalder konverter metoden ?
Avatar billede jesperbaldur Nybegynder
13. februar 2003 - 15:56 #6
Undskyld det er mig der ikke helt havde forstået opbygningen af try catch
Avatar billede disky Nybegynder
13. februar 2003 - 16:05 #7
Det er da helt okay, det er også en af de mere drilske dele af java :)
Avatar billede arne_v Ekspert
13. februar 2003 - 16:06 #8
Try catch er den mest robuste måde.

Det er ikke så svært at teste for valid heltal, men
decimal tal gør det hurtigt mere besværligt.

Alternativt hvis man bruger J2SE 1.4 så kan man bruge
regex som dette eksempel viser:

package test;

import java.util.regex.*;

public class DCheck {
    private static Pattern p = Pattern.compile("
  • ?[0-9]+[.]?[0-9]*");
    private static boolean doubleCheck(String s) {
        return p.matcher(s).matches();
    }
    private static void test(String s) {
        System.out.println("#" + s + "# " + doubleCheck(s));
        return;
    }
    public static void main(String[] args) {
        test("123");
        test("123.456");
        test("-123");
        test("-123.456");
        test("123.");
        test("12.34.56");
        test("1 2 3");
        test("-");
        test("");
    }
}
Avatar billede disky Nybegynder
13. februar 2003 - 16:11 #9
arne:
Hvad tror du egentligt tager længst tid under udførelsen ? Rexexp eller try/catch ?

Nogen erfaring med det ?



Jesper:
Personligt bruger jeg normalt altid try/catch til det.
Avatar billede arne_v Ekspert
13. februar 2003 - 16:35 #10
test + convert vil altid være langsommere end bare convert, så
hvis de fleste tal er korrekte vil try/catch altid være hurtigst.

Regex er mest interessant, fordi man kan ligge yderligere
check ind.

Man kunne f.eks. være interesseret i at definere at der højest
må være 2 decimaler.
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