![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сумма прописью [D6]
nyron © (2006-04-25 17:09:00)добрый день. помогите пожалуйста. мне нужно чтобы сумма из edit 1 была в edit 2 пописью. нашел ссылку где описывается как это сделать, но вот не могу разобрать как правильно сделать. если кто знает подскажите пожалуйста как правильно написать
Юрий Зотов (2006-04-28 10:08:00) [1]Таких функций в Сети - море, неужели сложно найти?
http://www.yandex.ru/yandsearch?rpt=rad&text=Delphi+%F1%F3%EC%EC%E0+%EF%F0%EE%EF%E8%F1%FC%FE
Результат поиска: страниц - 1556, сайтов - не менее 398.
konrads (2006-04-28 09:33:00) [2]Добавил мужской, женский и средний род
function TForm1.IntToTxt(Int: String; Rod: Integer): String;
// Функция превода положительных целых чисел без дробей любой величины в прописной формат.
// Параметр "Rod" = 1 - Мужской, 2 - женский, 3 - средний.
const EDIN : array [0..13] of String[6] =
('','один','два','три','четыре','пять','шесть','семь','восемь','девять','десять' ,'одна','две','одно');
OKON : array [1..2, 1..3] of String[2] = (('а','и',''),('','а','ов'));
DES : array [0..19] of String[20] = ('','десять','двадцать','тридцать',
'сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят', 'девяносто',
'','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать',
'шестнадцать','семнадцать','восемнадцать','девятнадцать');
SOT : array [0..9] of String[10] = ('','сто','двести','триста','четыреста',
'пятьсот','шестьсот','семьсот','восемьсот','девятьсот');
var l,l1,l2,l3 : integer;
f : boolean;
s,s1 : string;
begin
if int[1] = '0' then begin
result := 'Ноль';
// result := 'Ноль рублей';
exit;
end;
f := true;
s := '';
l := length(Int);
{
if Int[length(Int)-1] = '1' then s1 := 'рублей' else
case Int[length(Int)] of
'1' : s1 := 'рубль';
'2'..'4' : s1 := 'рубля';
else s1 := 'рублей';
end;
}
while l > 0 do begin
l := length(int);
l3 := l mod 3;
if l3 = 0 then l3 := 3;
case l3 of
1: if Int[1] <> '0' then f := true else f := false;
2: if copy(Int,1,2) <> '00' then f := true else f := false;
3: if copy(Int,1,3) <> '000' then f := true else f := false;
end;
while l3 > 0 do begin
l := length(Int);
l1 := l mod 3;
l2 := StrToInt(Int[1]);
if (l > 3) and (l < 7) and ((l2 = 1) or (l2 = 2)) and (l1 = 1) then l2 := l2 + 10;
if (l1 = 2) and (l2 = 1) and (Int[2] <> '0') then begin
l2 := 10 + StrToInt(Int[2]);
Int := copy(Int,2,length(Int) - 1);
dec(l3);
end;
if (Rod = 2) and ((l2 = 1) or (l2 = 2)) and (l = 1) then l2 := l2 + 10;
if (Rod = 3) and (l2 = 1) and (l = 1) then l2 := l2 + 12;
case l1 of
0: s := s + SOT[l2];
1: s := s + EDIN[l2];
2: s := s + DES[l2];
end;
if (l2 > 9) and (l1 = 2) then l2 := 5;
if l2 > 9 then l2 := l2 - 10;
case l2 of
1 : l2 := 1;
2..4: l2 := 2;
else l2 := 3;
end;
Dec(l3);
Int := Copy(Int, 2, length(Int) - 1);
s := s + ' ';
end;
s := s + ' ';
if f then
// В этом CASE можно добавлять всякие квинтилионы до опупения
// но думаю врядли кому даже триллионы понадобятся
case l of
4..6: s := s + 'тысяч' + OKON[1, l2];
7..9: s := s + 'миллион' + OKON[2, l2];
10..12: s := s + 'миллиард' + OKON[2, l2];
13..15: s := s + 'триллион' + OKON[2, l2];
end;
s := s + ' ';
l := length(int);
end;
result := s + s1;
// Уберём возможные двойные тройные пробелы между словами
l1 := Length(result); l := 1;
while l <> l1 do
if (result[l] = ' ') and (result[l + 1] = ' ') then begin
Delete(result, l, 1);
l1 := Length(result);
end else begin
Inc(l);
end;
// Первое слово с большой
if Length(result) > 0 then result[1] := chr(ord(result[1])-32);
end;
konrads (2006-04-26 09:34:00) [3]Всё закоментированное можно убрать если ненужно
konrads (2006-04-26 09:32:00) [4]Скопируй функцию себе в программу вызови её покакому-нибудь событию (нпример Buttun1.Click) Edit2.Text := ConvertToWord(StrToInt(Edit1.Text));
Если нужно получить болше чем трёхзначное число воспользуйся этой функцией:
function TForm1.IntToTxt(Int: String): String;
// Функция превода положительных целых чисел без дробей любой величины в прописной формат.
const EDIN : array [0..12] of String[6] =
('','один','два','три','четыре','пять','шесть','семь','восемь','девять','десять' ,'одна','две');
OKON : array [1..2, 1..3] of String[2] = (('а','и',''),('','а','ов'));
DES : array [0..19] of String[20] = ('','десять','двадцать','тридцать',
'сорок','пятьдесят','шестьдесят','семьдесят','восемьдесят', 'девяносто',
'','одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать',
'шестнадцать','семнадцать','восемнадцать','девятнадцать');
SOT : array [0..9] of String[10] = ('','сто','двести','триста','четыреста',
'пятьсот','шестьсот','семьсот','восемьсот','девятьсот');
var l,l1,l2,l3 : integer;
f : boolean;
s,s1 : string;
begin
if int[1] = '0' then begin
result := 'Ноль';
// result := 'Ноль рублей';
exit;
end;
f := true;
s := '';
l := length(Int);
{
if Int[length(Int)-1] = '1' then s1 := 'рублей' else
case Int[length(Int)] of
'1' : s1 := 'рубль';
'2'..'4' : s1 := 'рубля';
else s1 := 'рублей';
end;
}
while l > 0 do begin
l := length(int);
l3 := l mod 3;
if l3 = 0 then l3 := 3;
case l3 of
1: if Int[1] <> '0' then f := true else f := false;
2: if copy(Int,1,2) <> '00' then f := true else f := false;
3: if copy(Int,1,3) <> '000' then f := true else f := false;
end;
while l3 > 0 do begin
l := length(Int);
l1 := l mod 3;
l2 := StrToInt(Int[1]);
if (l > 3) and (l < 7) and ((l2 = 1) or (l2 = 2)) and (l1 = 1) then l2 := l2 + 10;
if (l1 = 2) and (l2 = 1) and (Int[2] <> '0') then begin
l2 := 10 + StrToInt(Int[2]);
Int := copy(Int,2,length(Int) - 1);
dec(l3);
end;
case l1 of
0: s := s + SOT[l2];
1: s := s + EDIN[l2];
2: s := s + DES[l2];
end;
if (l2 > 9) and (l1 = 2) then l2 := 5;
if l2 > 9 then l2 := l2 - 10;
case l2 of
1 : l2 := 1;
2..4: l2 := 2;
else l2 := 3;
end;
Dec(l3);
Int := Copy(Int, 2, length(Int) - 1);
s := s + ' ';
end;
s := s + ' ';
if f then
// В этом CASE можно добавлять всякие квинтилионы до опупения
// но думаю врядли кому даже триллионы понадобятся
case l of
4..6: s := s + 'тысяч' + OKON[1, l2];
7..9: s := s + 'миллион' + OKON[2, l2];
10..12: s := s + 'миллиард' + OKON[2, l2];
13..15: s := s + 'триллион' + OKON[2, l2];
end;
s := s + ' ';
l := length(int);
end;
result := s + s1;
{
// Это чтоб было красиво
// Уберём возможные двойные тройные пробелы между словами
l1 := Length(result); l := 1;
while l <> l1 do
if (result[l] = ' ') and (result[l + 1] = ' ') then begin
Delete(result, l, 1);
l1 := Length(result);
end else begin
Inc(l);
end;
}
{
// Первое слово с большой
if Length(result) > 0 then result[1] := chr(ord(result[1])-32);
}
end;
nyron (2006-04-25 23:44:00) [5]как использовать код ,который указан в ссылке, чтобы у меня из edit1 числа 123 в edit2 были прописью т.е. (сто двадцать три) или какой код можно использовать для этого. в общем как правильно так сделать???
Dmitrij_K (2006-04-25 18:40:00) [6]acedutils.narod.ru
EvS (2006-04-25 18:09:00) [7]Чего подсказать-то?
nyron (2006-04-25 17:10:00) [8]ссылка http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619349&n=19