Avatar billede elv Nybegynder
08. september 2001 - 11:14 Der er 9 kommentarer og
1 løsning

FloatToStr() Uden e-formattering

Hej

Jeg arbejder på et projekt med nogle pænt store tal, der skal parses ind og ud af forskellige strings. Når jeg læser et atl ind og f.eks. sætter det i en stor potens og derefter konverterer det tilbage til en double igen, kommer det dog til at stå i et forkert format. F.eks:
FloatToStr(Power(10,20)*2) giver et tal i stil med 2E+20
Kan denne formatering undgåes, så tallet i stedet bliver 200000000000000000000?

Avatar billede zerohero Nybegynder
08. september 2001 - 12:30 #1
prøv at brug FloatToStrF() istedet for FloatToStr(). På den måde kan du bestemme hvormange ciffre osv. din format skal se ud...

ZeroHero
Avatar billede martinlind Nybegynder
08. september 2001 - 15:27 #2
eller Format(\'%.2f\',[MyValue]); // giver 2 decimaler

/Martin
Avatar billede elv Nybegynder
08. september 2001 - 16:01 #3
Jeg kan ikke få nogen af de to løsninger til at fjerne E\'et fra den. Jeg har prøvet
var
E: Extended
begin
  e := power(10, 80)
  result := floattostrf(e, ffFixed, 18, 18);
end;
...men det virker ikke.
nogen specifikke løsninger?
Avatar billede martinlind Nybegynder
08. september 2001 - 20:35 #4
Du skal bruge FormatFloat(), og så skal du sørge for at din format string indeholder der antal 0/# som du har plader før . dvs i dit eks. skal din format string indeholde 80 * #

eks.:

E:= Power(10,8);
FormatFloat(\'#########.0\',E);

Dette virker

/Martin
Avatar billede elv Nybegynder
08. september 2001 - 22:14 #5
Nope, den går ikke. Power(10,8) virker altid og den bliver også konverteret som 100000000, men lige så snart man kommer højt nok op, går det galt igen. Prøv bare dit eksempel med power(10,20)... det virker ikke, heller ikke selvom man sætter flere #\'er ind
Avatar billede hreiff Nybegynder
25. oktober 2001 - 15:27 #6
Når du arbejder med double, har du kun en nøjagtighed på ca. 16 cifre, og det er derfor ikke relevant at udskrive det som \'normale\' tal idet
12345678901234567890 alligevel bliver til
12345678901234560000.
FloatToStrF(e,ffFixed,18,0) vil virke på tal op til 18 cifre (0 positioner efter komma).
Hvis du alligevel finder det interessant, må du selv lave en procedure.
Du kan bruge følgende (den virker kun med heltal):

function DoubleToIntStr(x: double):string;
{returnerer afrundet heltal af x (maks 255 cifre)}
var
  Temp,E: string;
  Enum,Epos,i: integer;
begin
  if abs(x) >= 1E18 then
  begin
    Temp := FloatToStrF(x,ffExponent,16,4);
    Epos := pos(\'E\',Temp);                   
    E:= copy(temp,Epos+1,length(temp)-Epos); 
    Enum:= strToInt(E);                     
    delete(temp,Epos,10);                   
    delete(temp,pos(\',\',temp),1);           
    delete(temp,pos(\'.\',temp),1);           
    for i := 1 to 255-length(temp) do       
      AppendStr(temp,\'0\');
    if Enum >= 0 then
    begin
      if temp[1] = \'-\' then                   
        delete(temp,Enum+3,255)               
      else
        delete(temp,Enum+2,255);
      result := temp;
    end
    else                 
      result := \'0\';     
  end
  else
    result := FloatToStrF(x,ffFixed,18,0);
end;



kaldes som følger:
var
  s: string;
  d: double;
begin
  d := 1.2345E34;
  s := DoubleToStr(d);
end;

returnerer 1234500000000000 osv.

//hreiff
Avatar billede elv Nybegynder
25. oktober 2001 - 18:21 #7
Jeg bruger ikke Double, jeg kører med Extended...
Avatar billede hreiff Nybegynder
26. oktober 2001 - 09:10 #8
Ok.
Så har du bare ca. 20 cifre i stedet for 16, men for rigtig store tal må du stadig lave din egen procedure, jævnfør ovenstående.
Du kan så bruge FloatToStrF(x,ffExtended,18,4), dvs 18 betydende cifre i proceduren. (FloatToStrF kan ikke håndtere mere)
Såvidt jeg ved, er der ingen indbyggede procedurer som kan det du ønsker.
Hvis du ændrer sidste linje til FloatToStrF(x,ffFixed,18,18) får du også nogle decimaler med.

//hreiff
Avatar billede hreiff Nybegynder
26. oktober 2001 - 10:17 #9
Og funktionen skal selvfølgelig hedde:
Function ExtenToStr(x: Extended):string
Avatar billede elv Nybegynder
26. oktober 2001 - 18:53 #10
Okay, den kan godt gå. Jeg har nu lavet systemet om til noget memory-fixeret, så tallene ligger i variablerne helt indtil de skal bruges, men svaret er jo godt nok alligevel :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester