Avatar billede pellekahn Nybegynder
08. maj 2003 - 18:29 Der er 13 kommentarer og
1 løsning

String kun indeholdende tal???

Hvis jeg har en String indeholdende et cpr-nr som en bruger har tastet, hvordan undersøger jeg så om denne kun indeholder tal? Kan man evt. undersøge et tegn af gangen om det ligger mellem 48-57 i ascii tabellen? Har tænkt på bare at parse den, og gå ud fra en evt. exception, men dette er jo ikke særligt pænt!!! :-)
Avatar billede arne_v Ekspert
08. maj 2003 - 18:31 #1
3 forskellige metoder testet:

public class IntegerTest {
    private static final int antal = 1000000;

    private static final String goodtext = "12345";
    private static final String badtext = "12345a";

    private static void test(String text) {
        long start1 = System.currentTimeMillis();
        for (int i = 0; i < antal; i++) {
            int tal = test1(text);
        }
        long stop1 = System.currentTimeMillis();
        long start2 = System.currentTimeMillis();
        for (int i = 0; i < antal; i++) {
            int tal = test2(text);
        }
        long stop2 = System.currentTimeMillis();
        long start3 = System.currentTimeMillis();
        for (int i = 0; i < antal; i++) {
            int tal = test3(text);
        }
        long stop3 = System.currentTimeMillis();
        System.out.println("test 1 (try/catch)  = " + (stop1 - start1));
        System.out.println("test 2 (homemade)= " + (stop2 - start2));
        System.out.println("test 3 (isDigit()) = " + (stop3 - start3));
    }
    private static int test1(String s) {
        try {
            return Integer.parseInt(s);
        } catch (NumberFormatException e) {
            return -1;
        }
    }
    private static int test2(String s) {
        for (int j = 0; j < s.length(); j++) {
            if (s.charAt(j) < '0' || s.charAt(j) > '9') {
                return -1;
            }
        }
        return Integer.parseInt(s);
    }
    private static int test3(String s) {
        for (int j = 0; j < s.length(); j++) {
            if (!Character.isDigit(s.charAt(j))) {
                return -1;
            }
        }
        return Integer.parseInt(s);
    }
    public static void main(String[] args) {
        System.out.println("All good:");
        test(goodtext);
        System.out.println("All bad:");
        test(badtext);
    }
}
Avatar billede arne_v Ekspert
08. maj 2003 - 18:34 #2
Hvis du kun vil teste og ikke have værdien så og vi skal håndtere
10 cifrede CPR numre:

private static boolean test1(String s) {
        try {
            int v = Long.parseLong(s);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }
    private static boolean test2(String s) {
        for (int j = 0; j < s.length(); j++) {
            if (s.charAt(j) < '0' || s.charAt(j) > '9') {
                return false;
            }
        }
        return true;
    }
    private static boolean test3(String s) {
        for (int j = 0; j < s.length(); j++) {
            if (!Character.isDigit(s.charAt(j))) {
                return false;
            }
        }
        return true;
    }
Avatar billede arne_v Ekspert
08. maj 2003 - 18:35 #3
long v = Long.parseLong(s);

:-)
Avatar billede arne_v Ekspert
08. maj 2003 - 18:37 #4
Jeg ville nok bruge test3 i dette tilfælde.
Avatar billede disky Nybegynder
08. maj 2003 - 18:46 #5
pellekahn:
Du kan med fordel kigge lige her:
http://www.eksperten.dk/spm/316951

Hvis du vil spare dine point kan du med fordel søge efter spørgsmål først.
De fleste spørgsmål er blevet stillet før :-)

Brug denne metode:
    private boolean check(String tal1)
    {
        char ch;
        for (int x=0;x<tal1.length();x++)
        {
            ch=tal1.charAt(x);
            if(!Character.isDigit(ch) && ch!='.')
            {
                return false;
            }
        }
    return true;
    }

Hvis du skal se om det er et cpr-nummer skal du lave modulos 11 check på tallet
Avatar billede erikjacobsen Ekspert
08. maj 2003 - 18:50 #6
Kun tal, kan undersøges med (Java 1.4):
import java.util.regex.*;

...

if (Pattern.matches("^[0-9]+$",dinstreng)) {
    System.out.println("OK");
} else {
    System.out.println("fejl");
}
Avatar billede arne_v Ekspert
08. maj 2003 - 18:52 #7
Hvis du vil have checket CPR numeret som sådan, så prøv med følgende:

import java.util.*;

public class CPR {
  // format of danish CPR number:
  //  ddmmyy-nnnc
  // where:
  //  dd  = day
  //  mm  = month
  //  yy  = year
  //  nnn = sequence (includes century)
  //  c  = checksum (includes sex)
  private String number;

  // constructor
  public CPR(String number) {
      this.number = number;
  }

  // check validity
  public boolean isValid() {
      int[] ix = { 0, 1, 2, 3, 4, 5, 7, 8, 9, 10 };
      int[] c = { 4, 3, 2, 7, 6, 5, 4, 3, 2, 1 };
      if (number.length() != 11) {
        return false;
      }
      if (number.charAt(6) != '-') {
        return false;
      }
      for (int i = 0; i < 10; i++) {
        if (!Character.isDigit(number.charAt(ix[i]))) {
            return false;
        }
      }
      if (dd() > 31) {
        return false;
      }
      if (mm() > 12) {
        return false;
      }
      if (century() == 0) {
        return false;
      }
      int temp = 0;
      for (int i = 0; i < 10; i++) {
        temp = temp + c[i] * numericValue(number.charAt(ix[i]));
      }
      return ((temp % 11) == 0);
  }
  // check make/female
  public boolean isMale() {
      return odd(numericValue(number.charAt(10)));
  }
  public boolean isFemale() {
      return even(numericValue(number.charAt(10)));
  }
  // get date of birth
  public Date getBirth() {
      int year = yy() + century();
      int mon = mm() - 1;
      int mday = dd();
      GregorianCalendar temp = new GregorianCalendar();
      temp.set(year, mon, mday);
      return temp.getTime();
  }
  // get age
  public int getAge() {
      Calendar now = GregorianCalendar.getInstance();
      Calendar born = new GregorianCalendar();
      born.setTime(getBirth());
      int result;
      result = now.get(Calendar.YEAR) - born.get(Calendar.YEAR);
      if (now.get(Calendar.DAY_OF_YEAR) < born.get(Calendar.DAY_OF_YEAR)) {
        result--;
      }
      return result;
  }

    // standard methods
    public int hashCode() {
        return number.hashCode();
    }
    public boolean equals(Object o) {
        if(o instanceof CPR) {
            return number.equals(((CPR)o).number);
        } else {
            return false;
        }
    }
  // get parts
  private int dd() {
      return Integer.parseInt(number.substring(0, 2));
  }
  private int mm() {
      return Integer.parseInt(number.substring(2, 4));
  }
  private int yy() {
      return Integer.parseInt(number.substring(4, 6));
  }
  // calculate century
  private int century() {
      switch (numericValue(number.charAt(7))) {
        case 0 :
        case 1 :
        case 2 :
        case 3 :
            return 1900;
        case 4 :
        case 9 :
            if (yy() < 37)
              return 2000;
            else
              return 1900;
        case 5 :
        case 6 :
        case 7 :
        case 8 :
            if (yy() < 37)
              return 2000;
            else if (yy() > 57)
              return 1800;
            else
              return 0;
        default :
            return 0;
      }
  }
  // odd/even
  private static boolean odd(int v) {
      return ((v & 1) == 1);
  }
  private static boolean even(int v) {
      return ((v & 1) == 0);
  }
  // numeric value of char
  private static int numericValue(char c) {
      return (c - '0');
  }
}
Avatar billede arne_v Ekspert
08. maj 2003 - 18:52 #8
Bemærk dog at det er med bindestreg !
Avatar billede aslan Nybegynder
10. maj 2003 - 00:13 #9
Brug dog noget som allerede er bygget i java. Her tjekker jeg for fødselsdato:


        private JFormattedTextField foedselsDto;
        private MaskFormatter formatter;

        try
        {
            formatter = new MaskFormatter( "##-##-####" );
        }catch(java.text.ParseException p){System.out.println(p);}           
        foedselsDto = new JFormattedTextField(formatter);
Avatar billede arne_v Ekspert
17. maj 2003 - 21:21 #10
pelle>

Har du fået et svar du kunne bruge ?
Avatar billede arne_v Ekspert
22. maj 2003 - 22:23 #11
??
Avatar billede arne_v Ekspert
06. juni 2003 - 23:45 #12
Tid at lukke spørgsmålet ?
Avatar billede pellekahn Nybegynder
19. juni 2003 - 14:13 #13
Hey Arne_V!!!

En lille bug har sniget sig i mine fingre. Jeg troede egentlig at jeg havde lukket og accepteret.... :-( SORRY..... Håber stadig at pointene kan bruges og at de ikke er blevet for gamle!!!!!
Avatar billede arne_v Ekspert
19. juni 2003 - 14:24 #14
Der er vist helt OK.

:-)
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