![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сумма прописью [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]Посмотри в кладовке, там были даже компоненты на эту тему