Gå til innhold

problemer med format engelsk/norsk


Anbefalte innlegg

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
Videoannonse
Annonse

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

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

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
(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
  • 4 uker senere...

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
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 av aadnk
Lenke til kommentar
  • 3 uker senere...

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...