"Советы по Delphi. Версия 1.4.3 от 1.1.2001" - читать интересную книгу автора (Озеров Валентин)

Число строкой X

Сергей AKA WildSery прислал свой вариант:

Привожу мой вариант, написал для своего приложения за 20 минут. В силу специфики приложения не утруждал себя прописью полностью "рублей" и "копеек", а ограничился "руб." и "коп.", а также не было необходимости в знаке числа, по это все добавляется буквально 3-4 строками.

function  currency2str (value: double): string;

 const hundreds: array [0..9] of string = ('',' сто',' двести',' триста',' четыреста',' пятьсот',' шестьсот',' семьсот',' восемьсот',' девятьсот');

 tens: array [0..9] of string = ('','',' двадцать',' тридцать',' сорок',' пятьдесят',' шестьдесят',' семьдесят',' восемьдесят',' девяносто');

 ones: array [0..19] of string = ('','','',' три',' четыре',' пять',' шесть',' семь',' восемь',' девять',' десять',' одиннадцать',' двенадцать',' тринадцать',' четырнадцать',' пятнадцать',' шестнадцать',' семнадцать',' восемнадцать',' девятнадцать');

 razryad: array [0..6] of string = ('',' тысяч',' миллион',' миллиард',' триллион',' квадриллион',' квинтиллион');

 var s: string; i: integer; val: int64;


 function shortnum(s: string; raz: integer): string;

 begin

  Result:=hundreds[StrToInt(s[1])];

  if strtoint(s)=0 then exit;

  if s[2]lt;gt;'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 razgt;1 then result:=result+'ов';

   1: if raz=1 then result:=result+'а';

   2,3,4: if raz=1 then result:=result+'и' else if razgt;1 then result:=result+'а';

   end;

  end else begin

   Result:=Result+ones[StrToInt(Copy(s,2,2))];

   Result:=Result+razryad[raz];

   if razgt;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)gt;0 do begin

  Result:=shortNum(Copy('00'+s,Length('00'+s)-2,3),i)+Result;

  if length(s)gt;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;