home *** CD-ROM | disk | FTP | other *** search
- {prints flt on display to a given length and format}
- {could be converted to any text file varible like}
- {lst:,myfile etc. with an additional pram}
- PROCEDURE ftostr (u:flt; fieldsize:byte; mode:char);
-
- var num$:string 30; {string to written out}
- sign_u :integer;
- exp_u :integer;
- counter :integer;
- fieldleft :integer;
- chtoleft :integer;
- numzeros :integer;
- uu :array [1..digmax] of byte;
-
- {builds pusedo string too copy from}
- procedure fillarray;
-
- var n,m:byte;
-
- begin
- m:=1;
- for n:=1 to dpmax
- do begin
- uu[m]:=(u.dp[n] div 10)+ord('0');
- uu[m+1]:=(u.dp[n] mod 10)+ord('0');
- m:=m+2
- end;
- end; {fillarray}
-
- {completes string after decimal point}
- procedure fillfield;
-
- begin
- while (fieldleft>0) and (counter<=digmax)
- do begin
- append(num$,chr(uu[counter]));
- fieldleft:=fieldleft-1;
- counter:=counter+1
- end;
- while fieldleft>0
- do begin
- append(num$,'0');
- fieldleft:=fieldleft-1
- end;
- end; {fillfield}
-
- {for engineering type buy it from eric brom}
- procedure scitype;
-
- var exp$ :string 10;
- radix,x :integer;
- anyway :boolean;
-
- begin
- fillarray;
- setlength(num$,0);
- sign_u:=signdig(u);
- exp_u:=expvalue(u);
- if sign_u=1
- then append(num$,'-');
- append (num$,chr(uu[1]));
- append (num$,'.');
- setlength(exp$,0);
- append(exp$,'E');
- if exp_u <0
- then begin
- append(exp$,'-');
- exp_u:=abs(exp_u);
- end;
- radix:=10000;
- anyway:=false;
- for counter:=1 to 5
- do begin
- if (exp_u>=radix) or anyway
- then begin
- x:=exp_u div radix +ord('0');
- exp_u:=exp_u mod radix;
- radix:=radix div 10;
- append(exp$,chr(x));
- anyway:=true
- end
- else radix:=radix div 10
- end;
- x:=fieldsize+1-length(num$)-length(exp$);
- for counter :=2 to x
- do append(num$,chr(uu[counter]));
- append (num$,exp$);
- write(num$)
- end; {scitype}
-
-
- {this mode tells you as much as possible in the space allotted}
- {it drops thru to scitype automatic}
- procedure infotype;
-
- begin
- fillarray;
- setlength(num$,0);
- sign_u:=signdig(u);
- exp_u:=expvalue(u);
- fieldleft:=fieldsize;
- if sign_u=1
- then begin
- append(num$,'-');
- fieldleft:=fieldleft-1;
- end;
- chtoleft:=exp_u+1;
- if chtoleft>fieldleft
- then scitype
- else begin
- if chtoleft<1
- then begin
- append(num$,'0.');
- fieldleft:=fieldleft-2;
- numzeros:=0-chtoleft;
- if numzeros>(fieldleft-2)
- then scitype
- else begin
- fieldleft:=fieldleft-numzeros;
- while numzeros>0
- do begin
- append(num$,'0');
- numzeros:=numzeros-1
- end;
- counter:=1;
- fillfield;
- write(num$)
- end
- end
- else begin
- for counter:=1 to chtoleft
- do append(num$,chr(uu[counter]));
- counter:=chtoleft+1;
- fieldleft:=fieldleft-chtoleft;
- if fieldleft>0
- then begin
- append(num$,'.');
- fieldleft:=fieldleft-1;
- end;
- fillfield;
- write(num$)
- end
- end
- end; {infotype}
-
- {tries to hold decimal point in a given position but}
- {will drop thru to infotype to avoid displaying 0.0000}
- procedure fixtype;
-
- var fixval :integer;
- numblank :integer;
- holestoleft:integer;
-
- begin
- fillarray;
- setlength(num$,0);
- exp_u:=expvalue(u);
- sign_u:=signdig(u);
- fixval:=ord(mode)-ord('0');
- chtoleft:=exp_u+1;
- holestoleft:=fieldsize-fixval-sign_u-1;
- fieldleft:=fieldsize;
- if chtoleft>holestoleft
- then infotype
- else begin
- if chtoleft<1
- then begin
- numblank:=holestoleft-sign_u-1;
- while numblank>0
- do begin
- append(num$,' ');
- numblank:=numblank-1
- end;
- if sign_u=1
- then append(num$,'-');
- append(num$,'0.');
- fieldleft:=fixval;
- if (fieldleft+chtoleft)<1
- then infotype
- else begin
- while (chtoleft<0) and (fieldleft>0)
- do begin
- append(num$,'0');
- chtoleft:=chtoleft+1;
- fieldleft:=fieldleft-1
- end;
- counter:=1;
- fillfield;
- write(num$)
- end
- end
- else begin
- numblank:=holestoleft-sign_u-chtoleft;
- while numblank>0
- do begin
- append(num$,' ');
- numblank:=numblank-1;
- end;
- if sign_u=1
- then append(num$,'-');
- counter:=1;
- while chtoleft>0
- do begin
- append(num$,chr(uu[counter]));
- counter:=counter+1;
- chtoleft:=chtoleft-1
- end;
- append(num$,'.');
- fieldleft:=fixval;
- fillfield;
- write(num$)
- end
- end
- end; {fixtype}
-
- begin
- case mode of
- '0','1','2','3','4','5','6','7','8','9'
- :fixtype; {allows console entry of mode}
- 'i','I':infotype;
- else:scitype
- end; {case}
- end; {ftostr}
-