|
| komma til punktum??? Fra : Kasper |
Dato : 04-03-03 15:56 |
|
Hej
Jeg er lidt nybegynder hvad programmering angår.
Jeg prøver mig frem i VB 5.0, og er ved at lave en "valutaomregner"
Det, som er mit problem er, at selve "regneren" kan ikke finde ud af at
regne med kommatal. Hvis jeg intaster et punktum istedet, så kan den godt,
men ikke hvis jeg bruger komma-tasten på nummertastaturet...
Hvad kan jeg gøre?
På forhånd tak.
Kasper
| |
S. Melgaard (05-03-2003)
| Kommentar Fra : S. Melgaard |
Dato : 05-03-03 00:33 |
|
On Tue, 4 Mar 2003 15:56:18 +0100, "Kasper" <kasper_j@tdcadsl.dk>
wrote:
> Hvis jeg intaster et punktum istedet, så kan den godt,
> men ikke hvis jeg bruger komma-tasten på nummertastaturet...
> Hvad kan jeg gøre?
Jeg bruger VB6.0, som har en funktion der hedder FormatNumber - Jeg
tror også den findes i VB5.0
Du kan f.eks. skrive følgende:
Dim DitTal As Single
DitTal = FormatNumber(DitTal, 3, vbUseDefault, vbUseDefault,
vbUseDefault)
DitTal = DitTal + DitTal
Her lægges to decimaltal sammen......
Måske der er en nemmere måde at gøre det på....men på den her måde
bruger du den indstilling som somputeren er sat til.....Prøv dig frem
og se om du kan få det til at virke.....Ellers kan det være der er et
geni i NG'en der kan hjælpe!
Mvh.
Søren Melgaard
| |
Tomas Christiansen (05-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 05-03-03 09:51 |
|
S. Melgaard skrev:
> Dim DitTal As Single
>
> DitTal = FormatNumber(DitTal, 3, vbUseDefault, vbUseDefault,
> vbUseDefault)
Hvad er det egentlig at du vil vise her?
Hvis DitTal er en variabel af typen Single, hvad skulle man så få ud af
at eksplicit konvertere til en String for derefter implicit at
konvertere tilbage til en Single???
Til Kasper:
Vis lige den kode, hvor du forsøger at regne på kommatalsværdierne, og
hvor det ikke virker.
Jeg kan nemlig slet ikke forstå hvorfor det ikke virker, idet der som
standard benyttes komma (",") i VB på en dansk opsat Windows-maskine.
Du må altså have gjort noget "specielt" for ikke at få det til at virke!
-------
Tomas
| |
Kasper (05-03-2003)
| Kommentar Fra : Kasper |
Dato : 05-03-03 12:30 |
|
Jeg har "smidt programmet i news:dk.binear under emnet: program fra
dk.edb.programmering.basic....
Hvis jeg eksempelvis skriver 7,35 i kursfeltet og 2 i eurofeltet, så kan den
ikke finde ud af at regne med det. Den bruger kun det hele tal, nemlig 7.
Derimod hvis man skriver . istedet for , så kan den.
Kan i hjælpe??
Kasper
"Tomas Christiansen" <toc-nospam-01@blikroer.dk> skrev i en meddelelse
news:b44dp3$1p51$1@news.cybercity.dk...
> S. Melgaard skrev:
> Til Kasper:
>
> Vis lige den kode, hvor du forsøger at regne på kommatalsværdierne, og
> hvor det ikke virker.
> Jeg kan nemlig slet ikke forstå hvorfor det ikke virker, idet der som
> standard benyttes komma (",") i VB på en dansk opsat Windows-maskine.
>
> Du må altså have gjort noget "specielt" for ikke at få det til at virke!
>
> -------
> Tomas
>
| |
Kasper (05-03-2003)
| Kommentar Fra : Kasper |
Dato : 05-03-03 12:53 |
|
glemte og siget at den er YencEncoded... Men håber i får det til at virke...
"Kasper" <kasper_j@tdcadsl.dk> skrev i en meddelelse
news:3e65e187$0$52105$edfadb0f@dread16.news.tele.dk...
> Jeg har "smidt programmet i news:dk.binear under emnet: program fra
> dk.edb.programmering.basic....
> Hvis jeg eksempelvis skriver 7,35 i kursfeltet og 2 i eurofeltet, så kan
den
> ikke finde ud af at regne med det. Den bruger kun det hele tal, nemlig 7.
> Derimod hvis man skriver . istedet for , så kan den.
> Kan i hjælpe??
>
> Kasper
>
> "Tomas Christiansen" <toc-nospam-01@blikroer.dk> skrev i en meddelelse
> news:b44dp3$1p51$1@news.cybercity.dk...
> > S. Melgaard skrev:
> > Til Kasper:
> >
> > Vis lige den kode, hvor du forsøger at regne på kommatalsværdierne, og
> > hvor det ikke virker.
> > Jeg kan nemlig slet ikke forstå hvorfor det ikke virker, idet der som
> > standard benyttes komma (",") i VB på en dansk opsat Windows-maskine.
> >
> > Du må altså have gjort noget "specielt" for ikke at få det til at virke!
> >
> > -------
> > Tomas
> >
>
>
| |
Tomas Christiansen (05-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 05-03-03 22:47 |
|
Kasper skrev:
> glemte og siget at den er YencEncoded... Men håber i får det til at
virke...
Ikke umiddelbart. Brawny Lads yProxy ser ikke ud til at kunne klare
filen, men så vidt jeg kan se, har du smidt en exe-fil.
Det som jeg ønsker at se er en lille kodestump (altså kildetekst, source
om man vil), hvor du tager en værdi fra, jeg går ud fra at det er en
tekst-boks, og konverterer denne streng til et tal (implicit eller
eksplicit).
-------
Tomas
| |
S. Melgaard (05-03-2003)
| Kommentar Fra : S. Melgaard |
Dato : 05-03-03 13:32 |
|
On Wed, 5 Mar 2003 09:50:43 +0100, "Tomas Christiansen"
<toc-nospam-01@blikroer.dk> wrote:
>Hvad er det egentlig at du vil vise her?
Tja, måske jeg ikke har forstået hans problem, men for mig virker
det!!
Mvh.
Søren
| |
mhabio (05-03-2003)
| Kommentar Fra : mhabio |
Dato : 05-03-03 22:15 |
|
Hej
Du skal gå ind og ændre din komma settings i Internatial Settings under
kontrol panel. VB overholder regional settings når den viser tal i
textbokse. VB henter selv disse fra windows.
Men: Der er en bug i VB5 og VB6.0 når man skifter mellem strings og de
forskellige tal variabler. Du løser bedst problemet hvis du bruger
Val(DinStr) da den altid konverterer til punktum. Brug derfor nedenstående
funktioner til at finde ud af hvad der er Internaltion komma setting og til
at konvertere fra ',' til '.' inden du bruger Val
Public Function ReadDecimalSymbol() As String
ReadDecimalSymbol = Mid$(CStr(1.1), 2, 1)
End Function
Public Function ReplaceDecimalSymbol(PassedString) As String
ReplaceDecimalSymbol = Replace(PassedString, ",", ".")
End Function
--
Regards,
Mikkel H. Andersen
''~``
(\o-o/)
+------------------------.oooO--(_)--Oooo.---------------------------+
| |
| HomePage: http://FoxyLogic.com |
| .ooO |
| ( ) Oooo. |
+---------------------------\ (----( )-----------------------------+
\_) ) /
(_/
| |
Tomas Christiansen (05-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 05-03-03 22:41 |
|
mhabio skrev:
> Men: Der er en bug i VB5 og VB6.0 når man skifter mellem strings og de
> forskellige tal variabler.
Kan du beskrive denne bug nærmere?
> Du løser bedst problemet hvis du bruger
> Val(DinStr) da den altid konverterer til punktum.
Val konverterer ikke til punktum. Val forventer altid at
decimalskilletegnet er punktum, og ignorerer altså Windows'
indstillinger.
> Public Function ReplaceDecimalSymbol(PassedString) As String
> ReplaceDecimalSymbol = Replace(PassedString, ",", ".")
> End Function
Husk blot på at denne funktion forventer at Windows er indstillet til
dansk decimalskilletegn. Den _kan_ risikere at give problemer på en
engelsk indstillet PC.
-------
Tomas
| |
mhabio (06-03-2003)
| Kommentar Fra : mhabio |
Dato : 06-03-03 20:33 |
|
>> Du løser bedst problemet hvis du bruger
>> Val(DinStr) da den altid konverterer til punktum.
Du har helt ret, jeg fik det vendt forkert.
>Val konverterer ikke til punktum. Val forventer altid at
>decimalskilletegnet er punktum, og ignorerer altså Windows'
>indstillinger.
Jeps det er netop 'buggen' i Val funktionen.
En lille test (håber tabellen bliver pæn):
International setting CSng Val Text
, 11 1,1 1.1
. 1.1 1.1 1.1
, 1,1 1 1,1
. 11 1 1,1
Udfra dette kan man se at Val(text) vil give det rigtige tal hvis man
skifter et evt komma ud med punktum inden man konverterer text til tal,
ganske som du skriver. Det udnytter jeg i ReplaceDecimalSymbol i samarbejde
med Val.
>> Public Function ReplaceDecimalSymbol(PassedString) As String
>> ReplaceDecimalSymbol = Replace(PassedString, ",", ".")
>> End Function
>Husk blot på at denne funktion forventer at Windows er indstillet til
>dansk decimalskilletegn. Den _kan_ risikere at give problemer på en
>engelsk indstillet PC.
Hvis du bruger functionen sammen med Val så får du altid det rigtige
decimaltal ud af Val functionen, uafhængigt af international settings.
--
Regards,
Mikkel H. Andersen
''~``
(\o-o/)
+------------------------.oooO--(_)--Oooo.---------------------------+
| |
| HomePage: http://FoxyLogic.com |
| .ooO |
| ( ) Oooo. |
+---------------------------\ (----( )-----------------------------+
\_) ) /
(_/
| |
Tomas Christiansen (06-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 06-03-03 22:47 |
|
mhabio skrev:
> >Val konverterer ikke til punktum. Val forventer altid at
> >decimalskilletegnet er punktum, og ignorerer altså Windows'
> >indstillinger.
>
> Jeps det er netop 'buggen' i Val funktionen.
Det kan vist ikke betegnes som en 'bug', men en 'feature'.
Man skal blot huske at alle C-konverteringsfunktionerne (CSng, CDbl,
CCur, ...) kigger på regionale indstiller, og Val gør ikke, som det så
udmærket er beskrevet i VB's dokumentation:
"You should use the data-type conversion functions instead of Val to
provide internationally aware conversions from one data type to another.
For example, when you use CCur, different decimal separators, different
thousand separators, and various currency options are properly
recognized depending on the locale setting of your computer."
> >> Public Function ReplaceDecimalSymbol(PassedString) As String
> >> ReplaceDecimalSymbol = Replace(PassedString, ",", ".")
> >> End Function
....
> Hvis du bruger functionen sammen med Val så får du altid det rigtige
> decimaltal ud af Val functionen, uafhængigt af international settings.
Lad mig komme med et lille eksempel:
Dim s As String
s = Format(1234.5, "Currency")
MsgBox s & vbTab & Val(ReplaceDecimalSymbol(s)) + 1
Det går gruelig galt!
Desuden har du slet ikke angivet hvilken type PassedString er, og den
overføres ByRef, hvilket man kun bør gøre, hvis man ønsker at _ændre_ på
den aktuelle parameter (for nu at tage det hele med). Jeg ville være
meget ked af at se den slags i produktionskode, men til "hobbybrug" kan
det selvfølgelig være udmærket.
-------
Tomas
| |
mhabio (06-03-2003)
| Kommentar Fra : mhabio |
Dato : 06-03-03 23:31 |
|
Hej Tomas
> Dim s As String
> s = Format(1234.5, "Currency")
> MsgBox s & vbTab & Val(ReplaceDecimalSymbol(s)) + 1
Den er for søgt, strengen er ikke bare et tal efter turen gennem Format !!.
Prøv at søge lidt i andre grupper og se hvad der foreslåes der til løsning
af komma, punktum problematikken. Der er et par svar fra habile gutter som
du sikker kender hvis du følger med i grupperne.
Der opstår stadig problemer de andre konvertionsfunctioner i VB, for hvis en
bruger ikke er klar over hvad der bruges, komma eller punktum, kan cSng,
Ccur ect ikke bruges uden hjælpefunktioner som tjekker input.
ByRef, ByVal hmmmmm det kommer an på situationen......, PassedString skal
klart være as string hvis inputtet kommer fra en tekstboks.
Hobbybrug........det er klart, jeg lever af noget helt andet...
Anyway, Kaspers oprindelige post (mon han følger med endnu) var omkring
løsningen til streng til tal konvertering og det er vist løst nu. Ellers er
jeg spændt på at se din løsning snart, og gerne en der køre i kina og USA
også. Send endelig noget 'produktionskode' så kan vi alle lære lidt af dig
GGG.
--
Later
Mikkel H. Andersen
| |
Tomas Christiansen (07-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 07-03-03 00:05 |
|
mhabio skrev:
> > s = Format(1234.5, "Currency")
....
> Den er for søgt, strengen er ikke bare et tal efter turen gennem
Format !!.
Undskyld, undskyld, undskyld. Jeg kom vist til at publicere et af mine
egne tests!
Den rigtige kode kommer her:
Dim s As String
s = Format(1234.5, "Standard")
MsgBox s & vbTab & Val(ReplaceDecimalSymbol(s)) + 1
> Der opstår stadig problemer de andre konvertionsfunctioner i VB, for
hvis en
> bruger ikke er klar over hvad der bruges, komma eller punktum, kan
cSng,
> Ccur ect ikke bruges uden hjælpefunktioner som tjekker input.
Er idéen ikke enten at lade VB gøre hele arbejdet for dig, og holde sig
til C-funktionerne - så virker det hele hver gang - eller at håndtere
det hele selv, dvs. aflæse betydningen af "," og "." selv klare ærterne
med Val og andre hjælpemidler?
Den første metode er vel i de fleste tilfælde at foretrække? Hvorfor
selv bruge krudt på noget som er indbygget i VB?
> ByRef, ByVal hmmmmm det kommer an på situationen......, PassedString
skal
> klart være as string hvis inputtet kommer fra en tekstboks.
Tja, men hvorfor angiver du det så ikke, i stedet for at lade det være
en variant. Du har dog sat type på funktionsværdien.
> Anyway, Kaspers oprindelige post (mon han følger med endnu) var
omkring
> løsningen til streng til tal konvertering og det er vist løst nu.
Lad os prøve at spørge: "Kasper, har du fået løst dit problem, eller har
vi bare forvirret dig på et højere plan?"
> jeg spændt på at se din løsning snart, og gerne en der køre i kina og
USA
> også.
Løsning er kun at bruge C-funktionerne og lade folk taste i det format
som deres computer nu en gang er sat op til.
Samme løsning er valgt i f.eks. Excel, og det virker så vidt jeg ved i
ret mange lande!
-------
Tomas
| |
Kasper (07-03-2003)
| Kommentar Fra : Kasper |
Dato : 07-03-03 09:03 |
|
"Tomas Christiansen" <toc-nospam-01@blikroer.dk> skrev i en meddelelse
news:b48k4e$vb6$1@news.cybercity.dk...
> mhabio skrev:
> Lad os prøve at spørge: "Kasper, har du fået løst dit problem, eller har
> vi bare forvirret dig på et højere plan?"
Ja Ja... Jeg følger med endnu, men synes ikke rigtig at kunne få det til at
fungerer... Den kode du kommere med her:
Dim s As String
s = Format(1234.5, "Standard")
MsgBox s & vbTab & Val(ReplaceDecimalSymbol(s)) + 1
tror jeg ikke VB 5.0 kan finde ud af. den kommer med en fejl som hedder:
Compile Errror
Sub or Function not defined
Men i det store hele er jeg lidt forvirret, da jeg som sagt er
nybegynder....
Men ellers tak for de mange svar...
Kasper
| |
mhabio (07-03-2003)
| Kommentar Fra : mhabio |
Dato : 07-03-03 22:22 |
|
Hej Kasper,
Brug nedenstående sammen med tre Text bokse og en knap. Hvis du ikke bruger
1000-adskiller så virker denne kode:
Private Sub Command1_Click()
Tal1 = Val(ReplaceDecimalSymbol(Text1.Text))
Tal2 = Val(ReplaceDecimalSymbol(Text2.Text))
Tal3 = Tal1 + Tal2
Text3.Text = Tal3
End Sub
Private Function ReplaceDecimalSymbol(PassedString As String) As String
ReplaceDecimalSymbol = Replace(PassedString, ",", ".")
End Function
--
Regards,
Mikkel H. Andersen
| |
Tomas Christiansen (08-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 08-03-03 01:05 |
|
mhabio skrev:
> Brug nedenstående sammen med tre Text bokse og en knap. Hvis du ikke
bruger
> 1000-adskiller så virker denne kode:
>
> Private Sub Command1_Click()
> Tal1 = Val(ReplaceDecimalSymbol(Text1.Text))
> Tal2 = Val(ReplaceDecimalSymbol(Text2.Text))
> Tal3 = Tal1 + Tal2
> Text3.Text = Tal3
> End Sub
>
> Private Function ReplaceDecimalSymbol(PassedString As String) As
String
> ReplaceDecimalSymbol = Replace(PassedString, ",", ".")
> End Function
Eller brug nedenstående kode, som virker med tusind-adskiller og i alle
de lande hvor VB og Windows kan bruges:
Text3.Text = CDbl(Text1.Text) + CDbl(Text2.Text)
Kan det næsten siges mere enkelt og klart?
-------
Tomas
| |
mhabio (08-03-2003)
| Kommentar Fra : mhabio |
Dato : 08-03-03 10:19 |
|
>Eller brug nedenstående kode, som virker med tusind-adskiller og i alle
>de lande hvor VB og Windows kan bruges:
> Text3.Text = CDbl(Text1.Text) + CDbl(Text2.Text)
>Kan det næsten siges mere enkelt og klart?
Lige undtaget tilfældet hvor en bruger ikke er klar over om det er komma
eller punktum der bruges som seperator. Men det kan man jo lige tjekke inden
.. .. ... ....
Jeg har rodet med dette problem i forbindelse med nogle konfigureringsfiler
til et program og når disse filer er lavet her i DK og så skal læses ind i
systemer rundt om i verden, så er du nød til at 'lappe' lidt på enten CSng,
CDbl eller Val.
Nu er den her vist ikke længere, Kasper du har fået to løsninger, elegante
eller ej, så løser de dit problem. Om ikke andet så har de lært os at input
validering er vigtigt. I den nye version af VB (.Net) skulle der være kommet
mere styr på disse problemer (jeg har dog ikke hands on erfaring).
--
Regards,
Mikkel H. Andersen
| |
Tomas Christiansen (08-03-2003)
| Kommentar Fra : Tomas Christiansen |
Dato : 08-03-03 19:24 |
|
mhabio skrev:
> Nu er den her vist ikke længere, Kasper du har fået to løsninger,
elegante
> eller ej, så løser de dit problem. Om ikke andet så har de lært os at
input
> validering er vigtigt.
Så sandt som det er sagt. EOD.
-------
Tomas
| |
|
|