Привожу мой вариант, написал для своего приложения за 20 минут. В силу специфики приложения не утруждал себя прописью полностью "рублей" и "копеек", а ограничился "руб." и "коп.", а также не было необходимости в знаке числа, по это все добавляется буквально 3-4 строками.
function shortNum(s: string; raz: integer): string; begin Result:=hundreds[StrToInt(s[1])]; if StrToInt(s)=0 then Exit; if s[2]<>'1' then begin Result:=Result+tens[StrToInt(s[2])]; case StrToInt(s[3]) of 1: if raz=1 then Result:=Result+' одна' else Result:=Result+' один'; 2: if raz=1 then Result:=Result+' две' else Result:=Result+' два'; else Result:=Result+ones[StrToInt(s[3])]; end; Result:=Result+razryad[raz]; case StrToInt(s[3]) of 0,5,6,7,8,9: if raz>1 then Result:=Result+'ов'; 1: if raz=1 then Result:=Result+'а'; 2,3,4: if raz=1 then Result:=Result+'и' else if raz>1 then Result:=Result+'а'; end; end else begin Result:=Result+ones[StrToInt(Copy(s,2,2))]; Result:=Result+razryad[raz]; if raz>1 then Result:=Result+'ов'; end; end; begin
val:=Trunc(value); if val=0 then begin Result:='ноль'; Exit; end; s:=IntToStr(val); Result:=''; i:=0; while Length(s)>0 do begin Result:=shortNum(Copy('00'+s,Length('00'+s)-2,3),i)+Result; if Length(s)>3 then s:=Copy(s,1,Length(s)-3) else s:=''; inc(i); end; s:=IntToStr(Trunc((value-val)*100+0.5)); Result:=Result+' руб. '+s+' коп.';end;