Mega Code Archive

 
Categories / Delphi / Examples
 

Converting numbers to words

How to convert numbers like 2345697.347 to "two billion, three hundred and forty-five thousand, six hundred and ninety seven decimal three four seven." The following unit does the work. Please check the calling examples at the end. ================================================ unit Inwordsu; interface uses SysUtils,Dialogs; function InWords(const nNumber:Extended):String; implementation function InWords(const nNumber:Extended):String; const aUnits:array[0..9] of string=('','one ', 'two ', 'three ', 'four ', 'five ', 'six ', 'seven ','eight ','nine '); //Local function to convert decimal portion function cDecimal(const cDecDitxt:string):String; var len,x,n:Integer; nNumber:string[17]; begin result:=''; nNumber:=cDecDitxt; //cut off Zeros to the right while copy(nNumber,length(nNumber),1)='0' do delete(nNumber,length(nNumber),1); len:=length(nNumber); //No need to convert if it is all zeros if len=0 then exit; //Start conversion ! for x:=1 to len do begin n:=strToint(copy(nNumber,x,1)); if n=0 then result:=result+'zero ' else result:=result+aUnits[n]; end; if result<>'' then result:=' decimal '+trim(result); end; //Local function to convert the whole number portion function Num2EngWords(const nNumber, nWordIndex:integer):String; const aLargeNumWords:array[0..5] of string=('','thousand, ','million, ', 'billion, ', 'trillion, ', 'quadrillion, '); aTens:array[0..8] of string=('','twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'); aTwenties:array[10..19] of string=('ten ','eleven ', 'twelve ', 'thirteen ', 'fourteen ', 'fifteen ', 'sixteen ', 'seventeen ', 'eighteen ', 'nineteen '); var nQtnt,nNum,nMod:Integer; begin result:=''; if nNumber<1 then exit; nNum:=nNumber; if nNumber>99 then begin //Pick up hundreds and leave others nQtnt:=nNum div 100; nNum:=nNum mod 100; result:=aUnits[nQtnt]+'hundred and '; end; case nNum of 1..9: result:= result+aUnits[nNum]; {one to nine} 10..19: result:= result+aTwenties[nNum];{ten to nineteen} 20..99: begin nQtnt:=nNum div 10; nMod:=nNum mod 10; result:= result+aTens[nQtnt-1]; {digit at tenth place} if nMod<>0 then result:= result+'-'+aUnits[nMod] {digit at unit place} else result:= result+' '; end else if result<>'' then result:=copy(result,1,length(result)-4); end; result:= result+aLargeNumWords[nWordIndex]; {add thousand, million etc...} end; var nNum,nIndex:Integer; cStr,cDec:String; lNegative:Boolean; begin result:=''; if (nNumber>999999999999999999.0) then begin showmessage('Sorry this is too large ! larger than the budget of the whole world !!'); exit; end; str(nNumber:34:15,cStr); lNegative:=False; nIndex:=pos('-',cStr); {having - sign is negative} if nIndex>0 then begin lNegative:=True; cStr:=copy(cStr,nIndex+1,length(cStr)-nIndex); {trim off minus sign} end; while cStr[1]=' ' do {trim of spaces} delete(cStr,1,1); nIndex:=pos('.',cStr); {decimal position} if nIndex=0 then nIndex:=length(cStr)+1;{if no decimal it must be at the far right} cDec:=copy(cStr,nIndex+1,length(cStr)-nIndex); {digits after decimal point} cStr:=copy(cStr,1,nIndex-1); {digits before decimal point} nIndex:=0; {index to point the words thousand, million etc.} nNum:=length(cStr); {count of digits} while nNum>0 do begin if nNum<3 then begin result:=Num2EngWords(strToInt(copy(cStr,1,nNum)),nIndex)+result; cstr:=''; {less than 3 digits means finished} end else begin result:=Num2EngWords(strToInt(copy(cStr,nNum-2,3)),nIndex)+result; cStr:=copy(cStr,1,nNum-3); {cut off three rightmost digits} end; nNum:=length(cStr); {remaining number of digits} inc(nIndex); {increase the large number's word index} end; result:=trim(result)+cDecimal(cDec)+'.'; {finished, add a full stop} if lNegative then result:='minus '+result; {if the number is negative add "minus" at first} end; end. ============================== //Thanks Mr. KRISHNA SAPKOTA //E-Mail: krishna_sapkota@hotmail.com //for pointing out the misspelled function name in the calling example //below ! //Calling examples: {nNum:extended or nNum:Double} //nNum:=24693456799398.6078; {Corrected calling function name on Monday May 21, 2001} //label1.caption:=InWords(nNum); {nInt:Integer or nInt:longint} //nInt:=23456 //label2.caption:=InWords(nint); //label3.caption:=InWords(2345678965432.30045); //label4.caption:=InWords(896867);