30. maj 2002 - 08:49Der er
15 kommentarer og 1 løsning
Finde dato fra en String
Hej Jeg arbejder på en hjemmeside, og her skal brugeren angive en dato, så jeg ved ikke hvilken række følge dag, måned og år bliver skrevet i, men jeg kan forstille mig som nedenstående. Det jeg leder efter er en funktion, der kan finde ud af hvordan den er skrevet og returnerer datoen i et fast format. d/m d/mm dd/mm dd/mm-åååå d/m-åååå dd/m-åååå d/mm-åååå åååå-mm-dd åååå-dd/mm åå-dd/mm dd-mm-åå d-mm-åå d-m-åå ddmmåå ddmmåååå dd mmåååå ddmm åååå
Hvis du giver brugeren så mange valgmuligheder, har du ikke mange chancer for at gætte den rigtige dato, så enten
1) Fortæl brugeren at han skal skrive i et bestemt format fx DD-MM/YYYY og check det 2) Lav 3 dropdown boxe (til dag, måned, år) 3) Find en smart "datpicker" i JavaScript, som viser fx en måned af gangen med mulighed for at bladre.
Din metode virker, men er lidt af et misbrug af 'Exceptions'
En exception er beregner til at fange en undtagelse, ikke bruge som en del af et program. Performance på brugen af exceptions er rimelig dårlig, da de tager en del tid at udføre.
Jeg ved godt jeg selv er kommet med det foreslag at man kan gøre det på den måde, man skal bare vide hvad konsekvenser det har for hastigheden. Specielt hvis du har 20 forskellige mulige patterns.
Den klart bedste løsning er, at du laver en intelligent parsning af datoerne istedet.
Disky >>Den dag, der findes en SimpleDateFormat.parse(), som ikke kaster ex, så er jeg mere end villig til at revidere koden... try-catch-blokken er kun med som et nødvendigt onde...
Der findes regulære udtryk, bearhugx. Det vil være meget simplere at bruge i dit tilfælde (En exception oprettet og initialiser et objekt, der senere skal garbage-collectes. Det er lidt meget for så lidt)
Et eksempel med regulære udtryk, som så kan gøres mere eller mindre intelligent.
// String dato = "02 03/1"; // String dato = "2/3/2001"; String dato = "02-03-01";
Pattern dateExp = Pattern.compile("^(\\d+)[ /-](\\d+)[ /-](\\d+)$"); Matcher m = dateExp.matcher(dato); if (m.matches()) { int dd=Integer.parseInt(m.group(1)); int mm=Integer.parseInt(m.group(2)); int yy=Integer.parseInt(m.group(3)); if (yy<100) yy+=2000; System.out.println(dd+"-"+mm+"/"+yy); } else { System.out.println("Cornflakes"); }
Synes godt om
Ny brugerNybegynder
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.