Newsgroup: it.comp.lang.pascal
Titolo: Problema di conversione ....

Ciao a tutti vi invio un codice per convertire una stringa in numerica reale
in un numero reale
ho un piccolo problema, il valore ritornato non è uguale alla stringa almeno
per una parte dei numeri decimali
function strExtract(s : string; start, n : integer) : string;
    var s2 : string;
        i : integer;
    begin
      s2:='';
      if (start>0) and (start<ord(s[0])) then
        if (n>0) then
          begin
            if (n > ord(s[0])) then
              n:=ord(s[0])-start+1;
            for i:=0 to N-1 do
              s2:=s2+s[start+i];
          end;
      strExtract:=s2;
    end;
       function chrINstr(s : string; c : char) : integer;
       var pos : integer;
       begin
         pos:=1;
         while (pos<=ord(s[0])) and (s[pos]<>c) do
           pos:=pos+1;
         if pos>ord(s[0]) then
           chrINstr:=0
         else
           chrINstr:=pos;
       end;
function ValReal(s: string; var err : integer) : real;
var r,molt : real;
    intero, decimale : string;
    sep,i : integer;
begin
  r:=0;
  err:=0;
  (* cerchiamo il punto *)
  sep:=chrinstr(s,'.');
  if sep>0 then
    begin
      intero:=strextract(s,1,sep-1);
      decimale:=strextract(s,sep+1,length(s)-length(intero)-1);
    end
  else
    begin
      intero:=s;
      decimale:='';
    end;
  molt:=1;
  i:=length(intero);
  while(i>=1)and(err=0) do
    begin
      if (intero[i]<'0') and (intero[i]>'9') then
        err:=i
      else
        begin
          r:=r+(ord(intero[i])-48)*molt;
          i:=i-1;
          molt:=molt*10;
        end;
    end;
  i:=1;
  molt:=10;
  while(i<=length(decimale))do
    begin
      if (intero[i]<'0') and (intero[i]>'9') then
        err:=i
      else
        begin
          r:=r+(ord(intero[i])-48)/molt;
          i:=i+1;
          molt:=molt*10;
        end;
    end;
  ValReal:=r;
end;
Grazie ReDiCuori
--
L'informatica è un arte
---------------------------------------------------------
 
www.pascallike.too.it
 
http://utenti.lycos.it/pascallike
 il sito sulla programmazione pascal
sorgenti, tutorial ed utility
---------------------------------------------------------

 numerica reale in un numero reale
[...]
prova con questo prog che ho fatto tempo fa. non e' ottimizzato al massimo.
program STR_to_REAL;
uses    wincrt;
var     ciccio:string;
        risultato:real;
procedure STRtoREAL(str:string;var ris:real);
var       k,j,dmstr,pospunto:byte;
          tmp,pos:integer;
          dieci,num:real;
          punto,verify:boolean;
function verifica(espressione:string):boolean;
var      x:char;
         k:byte;
begin
     for k:=1 to dmstr do
     begin
          verify:=true;
          x:=espressione[k];
          if ((x>='0') and (x<='9')) or (x='.')
          then
              verify:=true
          else
          begin
                verify:=false;
                break;
          end;
     end;
end; (*Di verifica*)
begin
 dmstr:=length(str);
 verify:=true;
 verifica(str);
 punto:=false;
 if verify=true
   then begin
        for k:=1 to dmstr do
          if str[k]='.'
             then begin
                  punto:=true;
                  pospunto:=k;
                  break;
             end;
        if punto=true
           then begin
                pos:=pospunto-2;
           end
           else begin
                pos:=dmstr-1;
           end;
        for k:=1 to dmstr do
          Begin
          if str[k]='1' then tmp:=1;
          if str[k]='2' then tmp:=2;
          if str[k]='3' then tmp:=3;
          if str[k]='4' then tmp:=4;
          if str[k]='5' then tmp:=5;
          if str[k]='6' then tmp:=6;
          if str[k]='7' then tmp:=7;
          if str[k]='8' then tmp:=8;
          if str[k]='9' then tmp:=9;
          if str[k]='0' then tmp:=0;
          if str[k]='.' then tmp:=0;
          dieci:=1;
          if (pos>=0)
           then
                for j:=1 to pos do
                begin
                    dieci:=dieci*10;
                end
           else
                for j:=1 to abs(pos)-1 do
                begin
                dieci:=dieci/10;
                end;
          num:=(dieci*tmp) + num;
          pos:=pos-1;
        end;
 end;
   ris:=num;
end; (*Di STRtoREAL*)
begin
     readln(ciccio);
     strtoreal(ciccio,risultato);
     writeln;
     writeln(risultato:0:4);
end.