home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
swag
/
numbers.swg
/
0056_NUM2WORD.PAS.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-08-26
|
5KB
|
225 lines
Unit Num2Word;
{* Program by: Richard Weber - 08/02/94 - 4 hours work *}
{* 70614,2411 *}
Interface
{* BY: Richard Weber *}
{* CrazyWare - 08/02/94 *}
{* CompuServe ID: 70614,2411 *}
{* This program was written in 4 hours. *}
{* Program is self Explainatory. There is only one available function. *}
{* Function Number2Name(L : LongInt) : String; *}
{* If you call Number2Name(20) it will return the word equalivent *}
{* as a string. It function will process up to 2 billion and will *}
{* not process numbers less than zero or fractions of one. *}
{* I hope the unit comes in handy and will prevent you from working *}
{* one out form scratch. *}
{* Feel free to modify and expand it as will. Please leave me a message *}
{* for any questions or comments. *}
Function Number2Name(L : LongInt) : String;
{ Function converts Long Integer supplied to a Word String }
Implementation
CONST
N_Ones : Array[0..9] of String[5] =
('',
'One',
'Two' ,
'Three',
'Four',
'Five',
'Six',
'Seven',
'Eight',
'Nine');
N_OnesX : Array[0..9] of String[9] =
('Ten',
'Eleven',
'Twelve',
'Thirteen',
'Fourteen',
'Fifteen',
'Sixteen',
'Seventeen',
'Eightteen',
'Nineteen');
N_Tens : Array[2..10] of String[7] =
('Twenty',
'Thirty',
'Forty',
'Fifty',
'Sixty',
'Seventy',
'Eighty',
'Ninety',
'Hundred');
N_Extra : Array[1..3] of String[8] =
('Thousand',
'Million',
'Billion');
Hundred = 10; {* N_Tens[10] *}
Function LongVal(S : String) : LongInt;
Var
TmpVal : LongInt;
Count : Integer;
Begin
Val(S, TmpVal, Count);
LongVal := TmpVal;
End;
Function Long2Str(L : LongInt) : String;
Var
S : String;
Begin
Str(L,S);
Long2Str := S;
End;
Function Number2Name(L : LongInt) : String;
Var
NameString : String;
NumberString : String;
Finished : Boolean;
Place : Integer;
StopPlace : Integer;
BeginPlace : Integer;
CountPlace : Integer;
Function Denom(I : Integer) : String;
Var
TestPlace : Integer;
Begin
TestPlace := I Div 3;
If I Mod 3 <> 0 then Inc(TestPlace);
If TestPlace > 1 then
Denom := N_Extra[TestPlace-1]
Else
Denom := '';
End;
Function TensConvert(S : String) : String;
Var TmpStr : String;
Begin
If Length(S) > 2 then S := Copy(S,2,2);
TensConvert := '';
If LongVal(S) <= 19 then
Begin
If LongVal(S) >=10 then
TensConvert := N_OnesX[LongVal(S)-10]
Else
TensConvert := N_Ones[LongVal(S)];
End
Else
Begin
TmpStr := N_Tens[LongVal(S) Div 10];
If LongVal(S) Mod 10 <> 0 then
TmpStr := TmpStr + '-' + N_Ones[LongVal(S) Mod 10];
TensConvert := TmpStr;
End;
End;
Function HundredConvert(S : String; Place : BYTE) : String;
Var
TmpString : String;
Begin
TmpString := '';
If LongVal(S) > 0 then
Begin
If (Length(S) = 3) and (LongVal(S[1]) > 0) then
TmpString := TmpString + ' ' + N_Ones[LongVal(S[1])]+
' ' + N_Tens[Hundred];
TmpString := TmpString + ' ' + TensConvert(S);
TmpString := TmpString + ' ' + Denom(Place);
End;
HundredConvert := TmpString;
End;
Begin
If L > 0 then
Begin
StopPlace := 0;
Place := 3;
NameString := '';
NumberString := Long2Str(L);
Finished := False;
Repeat
If Place > Length(NumberString) then
Begin
Place := Length(NumberString);
Finished := True;
End;
IF Place <> StopPlace then
Begin
BeginPlace := Length(NumberString)-Place+1;
CountPlace := Place-StopPlace;
NameString := HundredConvert(Copy(NumberString,BeginPlace,CountPlace),Place ) + NameString;
End;
StopPlace := Place;
Inc(Place,3);
Until Finished;
Number2Name := NameString;
End
Else
Number2Name := ' Zero';
End;
Begin
End.
{ --------------- demo ------------------------- }
Program TestNum;
Uses Num2Word;
Var
Lop : Integer;
Tmp : LongInt;
Begin
Writeln;
Randomize;
For Lop := 1 to 10 do
Begin
Tmp := Random(65534);
Writeln(Tmp, Number2Name(Tmp));
End;
Readln;
For Lop := 0 to 20 do
Begin
Writeln(Lop, Number2Name(Lop));
End;
Readln;
For Lop := 10 to 100 do
Begin
Writeln(Lop*10, Number2Name(Lop*10));
End;
End.