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

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

сумма прописью [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


Наверх

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