Gå til innhold

Hjelp til datoformattering i VB6


Anbefalte innlegg

Videoannonse
Annonse

ka du ikke ta ett og ett tall, og legge dem sammen?

 

stort sett er det 2 tegn i en dato som ikke er et tall, eventuelt 1, viss de har utelatt arstallet

 

forst kan du kjore en loop pa antall tegn som ikke er ett tall, og sa trekke fra de to faregande tallene

 

PseudoCode:

Dim lDay as long, lMonth as long, lYear as long
scur = mid(strDato,1,1)
'finn dag...
Dim lCur as long
for lCur = 1 to len(strDato)
  If mid(strData,Lcur,1) <> ettNummer then
       lDay = left(strDato, lcur - 1)
       strDato = mid(strDato, lcur + 1)
       exit for
next lCur
'Finn Maaned...
for lCur = 1 to len(strDato)
  If mid(strData,Lcur,1)<> ettNummer then
       lMonth = left(strDato, lcur - 1)
       strDato = mid(strDato, lcur + 1)
       exit for
next lCur
if len(strDato) > 0 then
   lyear = strDato
end if

kan sikkert forbedres litt

Lenke til kommentar

Sub test()

MsgBox DateValue("1/2/2006")

MsgBox DateValue("01.2.2006")

MsgBox DateValue("1-2-06")

MsgBox DateValue("01-2-2006")

MsgBox DateValue("1.02.06")

MsgBox DateValue("01.02.2006")

MsgBox DateValue("1.2.2006")

MsgBox DateValue("1.2.6")

End Sub

 

Det denne ikke håndterer er rene tall som 0102 , 010206 eller 01022006. Det er ikke så vrient å skrive kode for sånt.

 

HTH. Beste hilsen Harald

Lenke til kommentar
  • 2 uker senere...

En dato er ikke bare en dato.

 

Jobber ikke med menneskelig input, men OCR av menneskelig/data output.

 

Og CDate tok ikke de fleste, derfor måtte jeg bygge opp min egen analysekomponent. Og det ser ut som den virker.

Endret av stoners
Lenke til kommentar
  • 2 uker senere...
En dato er ikke bare en dato.

 

Jobber ikke med menneskelig input, men OCR av menneskelig/data output.

 

Og CDate tok ikke de fleste, derfor måtte jeg bygge opp min egen analysekomponent. Og det ser ut som den virker.

6244799[/snapback]

 

Moro når en da kommer over brukere som ikke har norsk datoformatering i oppsettet på maskinen sin. Har slitt så sinnsykt med å takle både norsk og amerikansk dato...

 

01/05/06

 

Om dette er 1. mai eller 5. januar kommer helt an på hvordan brukeren har satt opp maskinen.... (Hvertfall med CDate funksjonen)

Lenke til kommentar

Det står lenger opp i tråden, fra 26.5. Kanskje dere ser noe annet enn jeg gjør. Men her er en enda tydeligere demo:

 

Sub test()

Dim D As Date

Dim S As String

 

S = "1/2/2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1-2 2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1/2-06"

D = DateValue(S)

MsgBox D, , S

 

S = "01.2.2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1-2-06"

D = DateValue(S)

MsgBox D, , S

 

S = "01-2-2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1.02.06"

D = DateValue(S)

MsgBox D, , S

 

S = "01.02.2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1.2.2006"

D = DateValue(S)

MsgBox D, , S

 

S = "1.2.6"

D = DateValue(S)

MsgBox D, , S

 

S = "1/2"

D = DateValue(S)

MsgBox D, , S

 

S = "Feb 01"

D = DateValue(S)

MsgBox D, , S

 

S = "1.feb"

D = DateValue(S)

MsgBox D, , S

 

S = "1 feb 06"

D = DateValue(S)

MsgBox D, , S

 

S = "1 Februar"

D = DateValue(S)

MsgBox D, , S

End Sub

 

Datevalue håndterer ikke rene tall som 0102 , 010206 eller 01022006. Det er ikke så vrient å skrive kode for sånt.

 

PS. Pussig nok kommer jeg over en søt artikkel om disse tings tilblivelse bare minutter etter at jeg har sendt dette. Her:

http://www.joelonsoftware.com/items/2006/06/16.html

 

HTH. Beste hilsen Harald

Endret av Harald Staff
Lenke til kommentar

Hmm,

 

Denne fungerer helt til du setter standards and formats til English U.S.

da gjør den akkurat de samme feilene, ettersom den da tror 01/02/06 er 2 januar.

 

Som en kan se slik:

 

S = "1/2/2006"

D = DateValue(S)

MsgBox "day: " & Day(D) & " month: " & Month(D) & " year: " & Year(D), , S

 

Altså om en nordmann har satt op maskinen sin feil, vil feil inntreffe.

 

I tillegg klarte ikke denne rutinen å håndtere datoer med . om maskinen er satt opp med engelske datoformater.

 

Har fått en beskrivelse av en funksjon her: https://www.diskusjon.no/index.php?showtopic=571460

 

som kanskje fungerer bra. Har ikke fått testet den ennå...

 

edit: Testet nå og den virker bulletproof! Byttet mellom de forskjellige datoformatene og den kommer ut med rett dato uansett. Hvorfor testet jeg ikke denne tidligere?!

Endret av [space]
Lenke til kommentar

Det er jo ikke sånn. I USA og på en US-engelsk oppsatt maskin vil strengen

S = "1/2/2006"

bety nettopp 2. januar. Og et lands maskiner vil ikke behøve å forholde seg til datoinnskrivninger eller datofelter inneholdende lokalt ugyldige datoformater.

 

Jeg ser i den andre tråden at du skal lage en multi-language versjon. Om du skal selge et program til US-oppsatte maskiner og der påstår at "1/2/2006" er i februar, da blir du neppe rikere enn Røkke. Du er nødt til å gjøre det på min måte dersom datoinnskrivning skal fungere i mange land med hvert lands logikk, det er hele ideen med pc'ens regionale innstillinger. Omvandle strengen til en datovariabel med DateValue, og så lagrer du datovariabelen i Accessbasen, det virker i alle land og du trenger ikke tenke mer på hvordan datoer skrives inn eller hvordan den lokale Access viser resultatene. Du har ekte, entydige, riktige datoer.

 

Det du beskriver som problematisk oppstår først når du begynner å sende datoer som tekststrenger over landegrenser med forskjellige formater "for å konvertere dem i utlandet". Men den ideen er ikke helt god i utgangspunktet ;)

 

HTH. Beste hilsen Harald

Endret av Harald Staff
Lenke til kommentar

Problemet er at jeg har hatt en del problemer med folk som får invalid date pga feil oppsett på maskinen. Dette er vel da typisk folk med piratkopiert windows, som ikke har giddet fikse på det under installasjonen.

 

I engelskspråklige land vil man vel ikke oppleve dette problemet da engelsk jo er standardinstillingen.

Lenke til kommentar

Da er det vel egentlig helst de som burde fikse problematikken på sin datamaskin, og ikke du i ditt program. Koden jeg gav deg i den andre tråden fungerer, som jeg nevnte, kun for DDMMYY og DDMMYYYY (da kan du ikke skrive 122006 og tro at du får 1.02.2006), eller D[ikke-tall]M[ikke-tall]Y[ikke-tall], der [ikke-tall] representerer en streng med karakterer som ikke er et tall (eksempelvis punktum eller skråstrek).

 

Når oppstår denne feilen for øvrig? Når de taster inn en dato, eller når de eksekverer programmet/modulen?

Lenke til kommentar
I engelskspråklige land vil man vel ikke oppleve dette problemet da engelsk jo er standardinstillingen.

6325141[/snapback]

Dette har du ikke skjønt, og jeg gir opp å hjelpe deg med følgende:

Hvis programmet ditt får inndata "1/2/2006" så må programmet vite om det med det menes 2. januar eller 1. februar. Det er bare tre måter å avgjøre det, og du kan bare bruke en av dem:

- bestemme at det alltid menes 2.januar;

- bestemme at det alltid menes 1.februar;

- sjekke om maskinen er satt opp med måned eller dag som første ledd i datoer.

 

Det er ellers rørende av deg å legge så mye jobb i å bistå late tyver og pirater. Jeg hadde nok ikke vært grei.

 

Beste hilsen Harald

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å
×
×
  • Opprett ny...