Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сумма прописью [D5, Win95/98, WinXP]


MakNik ©   (2004-06-17 11:45:00) 

Подскажите, может у кого есть готовый,алгоритмом формирования суммы прописью на украинском языке! Заранее спасибо


Ihor Osov'yak   (2004-06-17 16:15:00) [1]

Писалось лет надцать назад, еще в рамках подготовки перехода на гривню, посему одновременная поддержка и гривни, и

карбованца..
Выбросишь то, что относится к карбованцу. Вообще то первая редакция была еще на BP7, этим и обьясняется немного

странное использование comp. Имеет смысл изменить на int64.  Аргумент - в копейках.

Зы. Вот так я писал лет с десяток назад :-(.


unit u_Str;

interface

function UnMoneyToStr(M: Comp; flGr: boolean): string;

implementation

uses SysUtils;

function IntoRight(const aSrcStr: string; aLen: word): string;
var
 wStr: string;
 i: word;
begin
 if length(aSrcStr) >= alen then
 begin
   result := aSrcStr;
   Exit;
 end;
 wStr := '';
 for i := 1 to aLen - length(aSrcStr) do
   wStr := wStr + ' ';
 result := wStr + aSrcStr;
end;

function LeadingZero(aI: integer): string;
begin
 result := IntToStr(aI);
 if length(result) = 1 then
   result := '0' + result;
end;

function Get_3Digit(aVal: comp; mode: byte): word;
{mode:
 0 - коп
 1 - крб
 2 - тисячi
 3- млн
 4- млрд
 5 -трилй }
var
 s: string;
 w: word;
 i: integer;
begin
 Str(aVal: 20: 0, S);
 Trim(s);
 s := IntoRight(s, 20);
 case mode of
   0: s := Copy(s, 19, 2);
   1: s := Copy(s, 16, 3);
   2: s := Copy(s, 13, 3);
   3: s := Copy(s, 10, 3);
   4: s := Copy(s, 7, 3);
   5: s := Copy(s, 4, 3);
 end;
 Trim(S);
 if s = '' then
   s := '0';
 Val(S, W, i);
 Get_3Digit := w;
end;

const
 flWomanDigit: boolean = false;

function Conv9ToStr(w: word): string;
begin
 case w of
   0: Conv9ToStr := '';
   1: if flWomanDigit then
       Conv9ToStr := 'одна'
     else
       Conv9ToStr := 'один';
   2: if flWomanDigit then
       Conv9ToStr := 'двi'
     else
       Conv9ToStr := 'два';
   3: Conv9ToStr := 'три';
   4: Conv9ToStr := 'чотири';
   5: Conv9ToStr := 'п''ять';
   6: Conv9ToStr := 'шiсть';
   7: Conv9ToStr := 'сiм';
   8: Conv9ToStr := 'вiсiм';
   9: Conv9ToStr := 'дев''ять';
 else
   Conv9ToStr := '??';
 end;
end;

function Conv19ToStr(w: word): string;
begin
 case w of
   0..9: Conv19ToStr := Conv9ToStr(w);
   10: Conv19ToStr := 'десять';
   11: Conv19ToStr := 'одинадцять';
   12: Conv19ToStr := 'дванадцять';
   13: Conv19ToStr := 'тринадцять';
   14: Conv19ToStr := 'чотирнадцять';
   15: Conv19ToStr := 'п''ятнадцять';
   16: Conv19ToStr := 'шiстьнадцять';
   17: Conv19ToStr := 'сiмнадцять';
   18: Conv19ToStr := 'вiсiмнадцять';
   19: Conv19ToStr := 'дев''ятнадцять';
 else
   Conv19ToStr := '???';
 end;
end;

function Conv999ToStr(w: word): string;
var
 H, D, O: word;
 s: string;
begin
 H := W div 100;
 D := (w mod 100) div 10;
 O := w mod 10;
 s := '';
 case H of
   0: ;
   1: s := 'сто';
   2: s := 'двiстi';
   3: s := 'триста';
   4: s := 'чотириста';
   5: s := 'п''ятсот';
   6: s := 'шiстьсот';
   7: s := 'сiмсот';
   8: s := 'вiсiмсот';
   9: s := 'дев''ятсот';
 end;
 if s <> '' then
   s := s + ' ';
 case D of
   0: s := s + Conv9ToStr(O);
   1: s := s + Conv19ToStr(10 + O);
 else
   begin
     case D of
       2: s := s + 'двадцять ' + Conv9ToStr(O);
       3: s := s + 'тридцять ' + Conv9ToStr(O);
       4: s := s + 'сорок ' + Conv9ToStr(O);
       5: s := s + 'п''ятдесят ' + Conv9ToStr(O);
       6: s := s + 'шiстдесят ' + Conv9ToStr(O);
       7: s := s + 'сiмдесят ' + Conv9ToStr(O);
       8: s := s + 'вiсiмдесят ' + Conv9ToStr(O);
       9: s := s + 'девяносто ' + Conv9ToStr(O);
     end;
   end;
 end;
 if s <> '' then
   s := ' ' + s + ' ';
 //UpperRus(s);
 s := AnsiUpperCase(s);
 Conv999ToStr := s;
end;

function GramDigit(w: word): word;
begin
 GramDigit := 0;
 if w = 0 then
   exit;
 GramDigit := 3;
 if ((w > 4) and (w < 20)) then
   Exit;
 case (w mod 10) of
   1: GramDigit := 1;
   2..4: GramDigit := 2;
 end;
end;

function UnMoneyToStr(M: Comp; flGr: boolean): string;
{GrMoneyToStr(M:Comp):string;}
var
 s, pref: string;
 w: word;
begin
 pref := '';
 if M < 0 then
 begin
   pref := 'МIНУС ';
   M := -M;
 end;
 flWomanDigit := false;
 s := '';
 w := Get_3Digit(M, 5);
 s := Conv999ToStr(w);
 case GramDigit(w) of
   0: ;
   1: s := s + ' Трильйон ';
   2: s := s + ' Трильйони ';
 else
   s := s + ' Трильйонiв ';
 end;

 w := Get_3Digit(M, 4);
 s := Conv999ToStr(w);
 case GramDigit(w) of
   0: ;
   1: s := s + ' Мiльярд ';
   2: s := s + ' Мiльярди ';
 else
   s := s + ' Мiльярдiв ';
 end;

 w := Get_3Digit(M, 3);
 s := s + Conv999ToStr(w);
 case GramDigit(w) of
   0: ;
   1: s := s + ' мiльйон ';
   2: s := s + ' мiльйони ';
 else
   s := s + ' мiльйонiв ';
 end;

 flWomanDigit := true;

 w := Get_3Digit(M, 2);
 s := s + Conv999ToStr(w);
 case GramDigit(w) of
   0: ;
   1: s := s + ' тисяча ';
   2: s := s + ' тисячi ';
 else
   s := s + ' тисяч ';
 end;
 flWomanDigit := flGr {true};

 w := Get_3Digit(M, 1);
 s := s + Conv999ToStr(w);
 if s = '' then
   s := '0';
 if flGr then
   s := s + ' ГРН '
 else
   s := s + ' КРБ ';

 s := s + ' ' + LeadingZero(Get_3Digit(M, 0)) + ' коп.';
 //DeleteDoubleSpace(s);
 UnMoneyToStr {GrMoneyToStr} := pref + s;
end;

end.


Mim1   (2004-06-17 15:43:00) [2]

Хых, я вот подумал заменить результат русской функции на украинскую в конце квартала после 4х часов автоматом.
Вот приколка то будет :)


Тимохов   (2004-06-17 12:08:00) [3]

вот посмотри http://dtimokhov.narod.ru/2.txt
из моего старого проекта.
разберешься как сделать на украинском.


Ozone   (2004-06-17 11:55:00) [4]

Посмотри в кладовке, там были даже компоненты на эту тему


Наверх

Титульная страница Поиск, карта сайта Написать письмо