TFormatSettings defekt?

Tags:    delphi

Hej

Er TFormatSettings defekt på systemer, der ikke anvender punktum som deceimalseperator hvis man vil ændre den?

Jeg har en datastreng, fra en GPS, der indeholder et flydende tal med punktum som deceimalseperator og når jeg vil anvende FloatToStr så får en en fejl.

Hvis jeg sætter TFormatSettings.DeceimalSeperator:=',' får jeg stadig fejl.

Men ændrer jeg LCID og systemets deceimalseperator til '.' kan jeg lave alle de krumspring jeg vil. Noget tyder på at der virker efter forskrifterne bare man er punktum-orienteret på systemniveau.

Når man surfer nette rundt er alle eksempler baseret på punktum-systemer.

Jeg har for at løse problemet lavet min egen Float2Str.

Hvor ville det hele være meget nemmere hvis amerikanerne blot havde gennemført ISO 31-0 for længe siden. :-(

Er der nogen, som har en ide til løsning eller nærmere afklaring?

Mik D.



6 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 2 karma
Sorter efter stemmer Sorter efter dato
Umiddelbart så forstår jeg det sådan at du modtager en datastreng fra den her gps. det burde der jo som sådan ikke kunne laves om på hvordan det bliver sendt. Derfor er det op til dig at lave strengen om således at punktummer bliver replaced med kommaer.
den eneste måde jeg så lige kan komme på er sådan her(ikke testet..)
sin := strtofloat(stringreplace(dat, '.',',',[]));

Jeppe Johansen
Jeppesoftware@hotmail.com



Umiddelbart så forstår jeg det sådan at du modtager en datastreng fra den her gps. det burde der jo som sådan ikke kunne laves om på hvordan det bliver sendt. Derfor er det op til dig at lave strengen om således at punktummer bliver replaced med kommaer.
den eneste måde jeg så lige kan komme på er sådan her(ikke testet..)
sin := strtofloat(stringreplace(dat, '.',',',[]));

Jeppe Johansen
Jeppesoftware@hotmail.com


Rigtig rigtig dårlig idé... Så virke programmet jo ikke hvis det køre på en computer, hvor der bruges . som decimalseperator...

Kunne du eventuelt komme med et eksempel på hvordan sådan en datastreng fra gps'en ser ud? Og vise og koden der ikke virker?




Umiddelbart så forstår jeg det sådan at du modtager en datastreng fra den her gps. det burde der jo som sådan ikke kunne laves om på hvordan det bliver sendt. Derfor er det op til dig at lave strengen om således at punktummer bliver replaced med kommaer.
den eneste måde jeg så lige kan komme på er sådan her(ikke testet..)
sin := strtofloat(stringreplace(dat, '.',',',[]));

Jeppe Johansen
Jeppesoftware@hotmail.com


Rigtig rigtig dårlig idé... Så virke programmet jo ikke hvis det køre på en computer, hvor der bruges . som decimalseperator...

Kunne du eventuelt komme med et eksempel på hvordan sådan en datastreng fra gps'en ser ud? Og vise og koden der ikke virker?

Problemet er jo ikke hvordan tallet bliver vist. Hvis han modtager en datastreng som nødvendigvis må komme som en række bytes så skal han bruge den metode jeg skrev. Internt så er singlen jo ikke defineret på string form..

Edit: eller også er OP's spørgsmål bare defineret således at jeg har misforstået det?

Jeppe Johansen
Jeppesoftware@hotmail.com

[Redigeret d. 10/01-06 14:09:20 af Jeppe]



Hej Kasper og Jeppe

Principielt er det uden betydning om det er fra en GPS eller noget helt andet. Men for senere læsere og for de, som gerne vil vide noget om GPS data så er her en fin side med listning at datastrenge: http://www.commlinx.com.au/NMEA_sentences.htm Data kommer ud i serielt format og kan nemt læses på en COM port.

Men nu til sagen. Her er nogle eksempler fra min PC med US/UK Win, men med metriske instillinger.

En form med to labels kaldet Label1 og Label2.

Fold kodeboks ind/udKode 


Dette eksempel giver fejl ved D:=StrToFloat(Punktum); af typen EConvertError.

Så jeg lader mig inspirere af denne: http://delphi.about.com/library/rtl/blrtlTFormatSettings.htm

Fold kodeboks ind/udKode 


fs.DecimalSeparator:='.'; eller fs.DecimalSeparator:=','; gør ingen forskel. Jeg for stadig EConvertError ved D:=StrToFloat(Punktum);

Mik D.



C:=StrToFloat(Komma)


Ganske fin kode du fandt der. det kendte jeg ikke til at man kunne. du glemmer bare at bruge fs som andet argument i dit kald til strtofloat. c := strtofloat(komma, fs);

Jeppe Johansen
Jeppesoftware@hotmail.com



Hej Jeppe

Øv, nu troede jeg lige jeg havde fundet en fajl. Men så var det mig.

Tak for hjælpen.

Mik D.



t