bmptp@amdcad.AMD.COM (Trina Phan-Vu) (05/05/88)
I am posting this for a friend, please respond your answer in this account then I will forward the results to her. Thank you for your time. My friend needs an algorithm of the conversion from integer to numeric string in Pascal, i.e. an integer"369" to a numeric "369". She knew how to do it in C, so please only help in Pascal.
jik@athena.mit.edu (Jonathan I. Kamens) (05/06/88)
Although I find that the question asked was a bit vague (How do you
convert a "integer '369'" to a "numeric '369'?"), I assume that what
is being asked for is a piece of standard pascal code which will
convert an integer into a packed array of char. I've enclosed code
below which will do that -- it's fairly straightforward, actually. If
you are working on a Unix system, you can probably use the C libraries
which do the same thing, if you hack things around enough.
*************************
program convertertest(input, output);
const
MAXLEN = 12; { Maximum length of a numstring. This can probably be
set to a reasonably low number on most systems,
since the length of an integer on most systems is
restricted to far less than the highest possible
length of a string. }
type
numstring = packed array[0..MAXLEN] of char;
var
num : integer;
final : numstring;
procedure numtostring ( number : integer; { In }
var result : numstring); { Out }
{ Purpose: takes as input an integer and converts it to a string
Input: integer in number
Output: converted string in result
Diagnostics: If the integer is longer than will fit in the string,
result[0] will be assigned chr(0). Otherwise, it is
set to the length of the string.
Author: Jonathan Kamens, MIT '91, jik@ATHENA.MIT.EDU }
var
factor : integer;
digit : integer;
place : integer;
begin
for place := 0 to MAXLEN do
result[place] := chr(0);
place := 0;
factor := 1;
while (number / factor) >= 10 do
factor := factor * 10;
while ((factor >= 1) and (place < MAXLEN)) do
begin
digit := number div factor;
number := number - (digit * factor);
place := place + 1;
result[0] := chr(place);
result[place] := chr(ord('0') + digit);
factor := factor div 10
end;
if (factor >= 1)
then result[0] := chr(0)
end;
begin
repeat
readln(num);
numtostring(num, final);
if final[0] = chr(0)
then writeln('Number is too long to convert.')
else writeln(final)
until (num = 0);
end.
*************************
| "This has been a test of the emergency broadcasting
-=> Jonathan I. Kamens | system. If there had been a real emergency, the
MIT '91 | radio to which you are listening would have been
jik@ATHENA.MIT.EDU | dissolved by the heatwave following the impact of
| the first warhead."kirsch@braggvax.arpa (David Kirschbaum) (05/06/88)
The first two functions functions (in Turbo Pascal v3.0, but should work
elsewhere) convert numbers to strings. The function RtoS trims the leading
space(s) that Turbo puts on a string using the STR(r:8:2, NrStr) setup.
The next two procedures work the other way, and include a flashy little
error-trapping routine.
David Kirschbaum
Toad Hall
kirsch@braggvax.ARPA
*** CUT HERE ***
TYPE
Str8 = STRING[8];
Str12 = STRING[12];
FUNCTION ItoS(i : INTEGER) : Str8;
{convert integer to string.}
VAR NrS : Str8;
BEGIN
STR(i,NrS); {create a working NrS, no padding}
ItoS := NrS;
END; {of ItoS}
FUNCTION RtoS(r : REAL) : Str12;
{convert real to string. In this case, I was working with dollars,
so that's why just the two decimal points.}
VAR NrS : Str12;
BEGIN
IF r = 0.0 THEN RtoS := '0.00'
ELSE BEGIN
STR(r:8:2,NrS); {create a working NrS, no padding}
WHILE (LENGTH(NrS) > 0) AND (NrS[1] = ' ') DO
Delete(NrS,1,1); {trim leading spaces}
RtoS := NrS; {return string}
END;
END; {of RtoS}
PROCEDURE Say_BadNr(NrS : Str8; code : INTEGER);
{used by StoR and StoI}
BEGIN
Writeln;
Writeln('Incorrect entry.');
Writeln(NrS); {display the response}
NrS := ' '; {get a blank line}
NrS[code] := '^'; {point to bad char}
Writeln(NrS); {display the pointer}
END; {of Say_BadNr}
PROCEDURE StoR(NrS : Str8; VAR r : REAL; VAR code : INTEGER);
{Convert string to real, return global variable code}
BEGIN
VAL(NrS,r,code); {convert to real}
IF code <> 0 THEN BEGIN {error}
Say_BadNr(NrS, code); {display error msg}
r := 0; {clear the variable}
END;
END; {of StoR}
PROCEDURE StoI(NrS : Str8; VAR i, code : INTEGER);
{Convert string to integer, return variables i and code}
BEGIN
VAL(NrS,i,code); {convert to integer}
IF code <> 0 THEN BEGIN {error}
Say_BadNr(NrS, code); {display error msg}
i := 0; {clear the variable}
END;
END; {of StoI}bmptp@amdcad.AMD.COM (Trina Phan-Vu) (05/10/88)
Thank you all who responsed to the question of integer conversion. My friend already got the answer and she was so impressed with all the helps she got. Thanks again.