[space] Skrevet 30. april 2006 Del Skrevet 30. april 2006 Prøver å lage en engelsk versjon (multilanguage) av et program jeg har, og har kommet over noen problemer med dato og komma. Engelskmenn har jo mm/dd/yy og 1,234.56 hvor vi har dd.mm.yy og 1.234,56 Jeg har noen felt der brukeren skal skrive inn dåde dato og desimaltegn. Dette fungerer ikke helt topp nå... Om jeg skriver inn 1.3 i desimalfeltet får jeg Run-time error -2147217887 (80040e21), når jeg skal oppdatere databasen. Endrer jeg dates and formats (under kontrollpanelet) til english, får jeg også problemer med datofeltene. I sverige bruker man dd-mm-yy... Finnes det noen enkel måte å sikre seg mot alle forskjellige skrivemåter av desimaler og datoer? ( uanhengig av dates and formats innstillingene på pcen ) Lenke til kommentar
aadnk Skrevet 30. april 2006 Del Skrevet 30. april 2006 Tja, jeg ville da tro de respektive konverteringsfunksjoner (eksempelvis CDate() og CDbl()) allerede tar hensyn til de lokale regionalinnstillinger (med tanke på tegn og rekkefølge). Det beste er nok å la det være slik. Selv om et programs brukergrensesnitt er satt til engelsk, burde de regionale innstillinger likevel korrespondere med hva de globale innstillinger tilsier. Det er for øvrig viktig at du anvender C-konverteringfunskjonene hyppig dersom du skriver til databaser. Du nevner ikke hvilken database du benytter, men det kan jo tenkes at den ikke riktig oppfatter hvilken type variabelen er, og lagrer den som en streng. Da ville en møte problematikk dersom en så åpnet databasen i et system med andre regionale innstilllinger. Om du trenger mer informasjon om de regionale innstillingene på det lokale systemet, kan du f.eks. bruke denne kodeeksempelet. Da kan du jo evt. bruke Replace, Format eller liknende til å konvertere mellom de ulike formatene. Lenke til kommentar
backup Skrevet 30. april 2006 Del Skrevet 30. april 2006 I vb 2005 kan du for eksempel gjøre det slik: Imports System.Globalization Imports System.Threading 'Får vb-programmet til å tilpasse seg den aktuelle windows (egelsk/norsk/svensk etc.): Dim kultur As String kultur = Thread.CurrentThread.CurrentCulture.ToString Thread.CurrentThread.CurrentCulture = New CultureInfo(kultur, False) Lenke til kommentar
[space] Skrevet 30. april 2006 Forfatter Del Skrevet 30. april 2006 Jeg bruker vel til en viss grad CSng funksjonen når jeg regner med tall i programmet. I tillegg har det gått igjen et problem at norske folk med engelsk windows, hvor ikke dates and formats er satt til norsk får feil. (Da hadde jeg sperret for bruk av / i datofeltet. Databasen er en MS Access base. Hva om jeg deler opp datofeltet i 3? en boks for dag, en for måned og en for år. Har CDate funksjonen en mulighet for å trekke ut f.eks. kun måned? (Som i Progress som jeg er vandt til å kode i, der jeg kan ta MONTH(TODAY) eller DAY(TODAY) får å få ut måned eller dag av en dato, der TODAY er datoen i dag) Lenke til kommentar
aadnk Skrevet 30. april 2006 Del Skrevet 30. april 2006 (Som i Progress som jeg er vandt til å kode i, der jeg kan ta MONTH(TODAY) eller DAY(TODAY) får å få ut måned eller dag av en dato, der TODAY er datoen i dag) 6016405[/snapback] Du kan benytte akkurat de samme funksjonene i VB. Year(Now), Month(Now) og Day(Now) gir henholdsvis året, måneden og dagen av den aktuelle dato. Lenke til kommentar
[space] Skrevet 27. mai 2006 Forfatter Del Skrevet 27. mai 2006 Hmm, Oppdaget et problem her nå. Om jeg har innstillingenew på pcen til English (america) skjer dette med datoen: Jeg skriver inn 01/06/2006 (altså 1 juni 2006) Når jeg trykker "lagre" endres denne til 06/01/2006 (Som da blir riktig i forhold til usa dato format) Om jeg trykker lagre på nytt bytter den tilbake til 01/06/2006 og blir da altså 6. januar 2006 ... Dette ser jeg fordi jeg har et annet felt som viser datoen + et gitt antall dager. Hvordan kan jeg få dette til å fungere skikkelig? Lenke til kommentar
aadnk Skrevet 27. mai 2006 Del Skrevet 27. mai 2006 (endret) Jeg skriver inn 01/06/2006 (altså 1 juni 2006)Når jeg trykker "lagre" endres denne til 06/01/2006 (Som da blir riktig i forhold til usa dato format) Hvordan kan jeg få dette til å fungere skikkelig? 6188426[/snapback] For å fikse dette må du nok unngå at den endrer rekkefølge her. Om ikke, VIL det uunngåelig oppstå feil som du ganske riktig har observert. Men det letteste blir kanskje i kreve at brukeren skriver inn ett format (DDMMYYYY) og trekke ut datoen med en selvskrevet funksjon (ConvertDate): Public Function ConvertDate(ByVal Expression As String) As Date On Error Resume Next Dim dDate As Date, aDate ' Sjekk hvorvidt lengden på datoen er riktig Select Case Len(Expression) Case 6, 8 ' DDMMYY eller DDMMYYYY ' Her kan vi muligens ha formatet DDMMYY, sjekk dette dDate = ConvertArray(SplitLenght(Expression, 2, 2, IIf(Len(Expression) = 6, 2, 4))) ' Returner dato dersom alt forløp som det skulle If Err.Number = 0 Then ConvertDate = dDate Else ' En feil inntraff ' MsgBox ... End If Case Is > 8 ' Samme som ovenfor, men her sannsynligvis med overflødige karakterer aDate = ConvertArray(SplitNonNumeric(Expression)) ' Returner dato If Err.Number = 0 Then ConvertDate = aDate Else ' En feil inntraff ' MsgBox ... End If Case Else ' Ingen dato ' Informer om dette MsgBox "Invalid date", vbCritical, "Error" End Select End Function ' Konverterer en array til dato. Bruker det første, andre og tredje elementet. Private Function ConvertArray(aDate() As Variant) As Date Dim lngLower As Long ' Hent indeks til det nederste elementet lngLower = LBound(aDate) ' Returner en dato ConvertArray = DateSerial(aDate(lngLower + 2), aDate(lngLower + 1), aDate(lngLower)) End Function ' Denne funksjonen segmenterer en tekststreng etter hvorvidt karakterene er et nummer eller ei Private Function SplitNonNumeric(Text As String) As Variant() Dim Tell As Long, Start As Long, aTemp() As Variant, aCount As Long ' Sett søkeposisjonen Start = 1 ' Gå gjennom alle karakterer Do While Start < Len(Text) ' Søk inntil vi finner et tall If IsNumeric(Mid(Text, Start, 1)) Then ' Finn neste karakter som ikke er en bokstav For Tell = Start To Len(Text) If Not IsNumeric(Mid(Text, Tell, 1)) Then Exit For End If Next ' Øk størrelse på array ReDim Preserve aTemp(aCount) ' Sett inn elementet aTemp(aCount) = Mid(Text, Start, Tell - Start) ' Øk teller aCount = aCount + 1 ' Øk posisjon Start = Tell End If ' Gå til neste karakter Start = Start + 1 Loop ' Returner array SplitNonNumeric = aTemp End Function ' Denne funskjonen deler opp en streng etter visse lengder som angitt i Lenghts Private Function SplitLenght(Text As String, ParamArray Lenghts() As Variant) As Variant() On Error Resume Next Dim Tell As Long, Start As Long, aTemp() As Variant ' Først, initialiser variabel ReDim aTemp(LBound(Lenghts) To UBound(Lenghts)) ' Sett hvor vi skal begynne å trekke ut karakterer Start = 1 ' Del opp den angitte streng etter Lenghts-arrayen For Tell = LBound(Lenghts) To UBound(Lenghts) ' Hent ut segment aTemp(Tell) = Mid(Text, Start, Lenghts(Tell)) ' Øk ekstrakteringsvariabel Start = Start + Lenghts(Tell) Next ' Returner resultat SplitLenght = aTemp End Function Endret 27. mai 2006 av aadnk Lenke til kommentar
[space] Skrevet 17. juni 2006 Forfatter Del Skrevet 17. juni 2006 Dette fungerte jo faktisk knallbra! Artig detalj om jeg putter inn 01.24.2006, så kommer funksjonen ut med 01/12/2007. Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå