Как вывести число в виде прописи?

отредактировано 13:45 Раздел: FastReport 4.0
Подскажите, как в FR4 можно вывести число в PageFooter , а рядом с ним вывести это же число, только прописью?
(например, "всего строк на странице - 28 (двадцать восемь)")
Не могу подобрать качественное решение...
Спасибо

Комментарии

  • отредактировано September 2015
    1) В Memo с числом страниц пишешь onAfterData:
    MemoPageCountAfterData(Sender:TfrxComponent)
    begin
    MemoPageCount_LETTERS.Text := GetSummaToTaxt(Value);
    end;

    2) Перед самым началом кода добавляешь обработчик (ниже код для белорусских рублей - адаптируй под свой код)
    const
      Max000 = 6; {Кол-во триплетов - 000}
      MaxPosition = Max000 * 3; {Кол-во знаков в числе }
                
    var
      c100: array[0..9] of string;
      c11: array[0..9] of string;
      c10: array[0..9] of string;
      c1: array[0..1, 0..9] of string;
      c1000w: array[0..Max000] of integer;
      c1000:array[0..Max000] of string;
      w:array[0..1, 0..9] of string;
      ruble: array[0..9] of string;
      belarus: array[0..9] of string;      
      //Kopeek: array[0..9] of string;
    
      // -----21.11.2014---new
      OLD_SmetaID: integer;                                 
      ArrayOHR_wk_id :array of integer;
      ArrayOHR_SmetaID: array of integer;
      ArrayOHR_SmetaName: array of string;                                             
      ArrayOHR_ObjectID: array of integer;                                                                                     
      ArrayOHR_nkl: array of double;
      ArrayOHR_nkl_count_not_null: array of integer;                                                                                                                      
      ArrayOHR_pln: array of double;
      ArrayOHR_pln_count_not_null: array of integer;
    
      ArrayOHR_nkl_razdel: array of double;
      ArrayOHR_nkl_razdel_count_not_null: array of integer;
      ArrayOHR_sum_nkl_razdel: array of int64;                                                             
      ArrayOHR_pln_razdel: array of double;
      ArrayOHR_pln_razdel_count_not_null: array of integer;
      ArrayOHR_sum_pln_razdel: array of int64;                                                     
      OLD_RAZDEL: string;                         
        
      ArrayOHR_sum_zprab: array of int64;
      ArrayOHR_sum_zpmex: array of int64;
      ArrayOHR_sum_nkl: array of int64;
      ArrayOHR_sum_pln: array of int64;
      ArrayOHR_sum_work_rab: array of double;
      ArrayOHR_sum_work_mex: array of double;
      ArrayOHR_sum_mex: array of int64;
      ArrayOHR_sum_mat: array of int64;
      ArrayOHR_sum_transp: array of int64;
      ArrayOHR_sum_mat_zak: array of int64;
      ArrayOHR_sum_transp_zak: array of int64;
      ArrayOHR_sum_mat_equipment: array of int64;
      ArrayOHR_sum_transp_equipment: array of int64;
    
      ArrayOHR_sum_mat_equipment_razdel: array of int64;
      ArrayOHR_sum_transp_equipment_razdel: array of int64;      
        
      ArrayOHR_sum_mat_refundable: array of int64;                                                                                               
      ArrayOHR_sum_zprab_without_28: array of int64;
    
      ArrayOHR_sum_winter: array of int64;
      ArrayOHR_sum_FZP_winter: array of int64;
      ArrayOHR_sum_winter_razdel: array of int64;
      ArrayOHR_sum_FZP_winter_razdel: array of int64;                                                                                                                
        
      Sum_nkl_curr_razdel: int64;
      Sum_pln_curr_razdel: int64;
      Sum_mat_equipment_curr_razdel: int64;
      Sum_transp_equipment_curr_razdel: int64;
      Sum_winter_curr_razdel: int64;
      Sum_FZP_winter_curr_razdel: int64;
        
      sum_zprab,    
        sum_zpmex,
        sum_nkl,
        sum_pln,
        sum_mex,        
        sum_mat,  
        sum_mat_zak,                              
        sum_transp,  
        sum_transp_zak,  
        sum_mat_refundable,
        sum_zprab_without_28,
        sum_equipment,
        sum_winter,
        sum_FZP_winter :int64;
      // ---------------------                                                     
    
    
    function Round1(e:Extended):Extended;
    var
      frac1:Extended;
      sign : integer;                                    
    begin
      frac1 := abs(Frac(e));
      if e >=0 then        
        sign := 1
      else 
        sign := -1;
      //Trunc возвращает Integer, а значит обрабатывает не больше 2 млрд, поэтому от него отказался                                                          
      if frac1 >= 0.5 then
        Result := e + sign * (1-frac1)
      else
        Result := e - sign * frac1;                                          
    end;  
           
    procedure initalize;
    begin
           c1000[0]:='';
           c1000[1]:='тысяч';
           c1000[2]:='миллион';
           c1000[3]:='миллиард';
           c1000[4]:='триллион';
           c1000[5]:='квадраллион';
           c1000[6]:='квинтиллион';
    
           c1000w[0]:=0;
           c1000w[1]:=1;
           c1000w[2]:=0;
           c1000w[3]:=0;
           c1000w[4]:=0;
           c1000w[5]:=0;
           c1000w[6]:=0;
    
           w[0,0]:='ов ';
           w[0,1]:=' ';
           w[0,2]:='а ';
           w[0,3]:='а ';
           w[0,4]:='а ';
           w[0,5]:='ов ';
           w[0,6]:='ов ';
           w[0,7]:='ов ';
           w[0,8]:='ов ';
           w[0,9]:='ов ';
           w[1,0]:=' ';
           w[1,1]:='а ';
           w[1,2]:='и ';
           w[1,3]:='и ';
           w[1,4]:='и ';
           w[1,5]:=' ';
           w[1,6]:=' ';
           w[1,7]:=' ';
           w[1,8]:=' ';
           w[1,9]:=' ';
         c100[0]:='';
         c100[1]:='сто ';
         c100[2]:='двести ';
         c100[3]:='триста ';
         c100[4]:='четыреста ';
         c100[5]:='пятьсот ';
         c100[6]:='шестьсот ';
         c100[7]:='семьсот ';
         c100[8]:='восемьсот ';
         c100[9]:='девятьсот ';
    
          c10[0]:='';
          c10[1]:='десять ';
          c10[2]:='двадцать ';
          c10[3]:='тридцать ';
          c10[4]:='сорок ';
          c10[5]:='пятьдесят ';
          c10[6]:='шестьдесят ';
          c10[7]:='семьдесят ';
          c10[8]:='восемьдесят ';
          c10[9]:='девяносто ';
    
          c11[0]:='';
          c11[1]:='один';
          c11[2]:='две';
          c11[3]:='три';
          c11[4]:='четыр';
          c11[5]:='пят';
          c11[6]:='шест';
          c11[7]:='сем';
          c11[8]:='восем';
          c11[9]:='девят';
    
    
          c1[0,0]:='';
          c1[0,1]:='один ';
          c1[0,2]:='два ';
          c1[0,3]:='три ';
          c1[0,4]:='четыре ';
          c1[0,5]:='пять ';
          c1[0,6]:='шесть ';
          c1[0,7]:='семь ';
          c1[0,8]:='восемь ';
          c1[0,9]:='девять ';
    
          c1[1,0]:='';
          c1[1,1]:='одна ';
          c1[1,2]:='две ';
          c1[1,3]:='три ';
          c1[1,4]:='четыре ';
          c1[1,5]:='пять ';
          c1[1,6]:='шесть ';
          c1[1,7]:='семь ';
          c1[1,8]:='восемь ';
          c1[1,9]:='девять ';
    
          ruble[0]:='ей';
          ruble[1]:='ь';
          ruble[2]:='я';
          ruble[3]:='я';
          ruble[4]:='я';
          ruble[5]:='ей';
          ruble[6]:='ей';
          ruble[7]:='ей';
          ruble[8]:='ей';
          ruble[9]:='ей';
    
          belarus[0]:='их';
          belarus[1]:='ий';
          belarus[2]:='их';
          belarus[3]:='их';
          belarus[4]:='их';
          belarus[5]:='их';
          belarus[6]:='их';
          belarus[7]:='их';
          belarus[8]:='их';
          belarus[9]:='их';          
    
         // Kopeek[0]:='ек';
         // Kopeek[1]:='йка';
         // Kopeek[2]:='йки';
         // Kopeek[3]:='йки';
         // Kopeek[4]:='йки';
         // Kopeek[5]:='ек';
         // Kopeek[6]:='ек';
         // Kopeek[7]:='ек';
         // Kopeek[8]:='ек';
         // Kopeek[9]:='ек';
    
    end;
    
    function Ceil(const X: Extended): Integer;
    begin
      Result:=(Trunc(X));
      if Frac(X) > 0 then
        Inc(Result);
    end;
    
    Function IIF2( bln:boolean; TruePart:string; FalsePart:string):string;
    begin
      if bln then
        Result := TruePart
      else
        Result := FalsePart;
    end;
    
      function Num000toStr(S: string; woman: integer): string;
        {Num000toStr возвращает число для триплета}
    
      begin {Num000toStr}
        Result:= c100[ord(s[1])-ord('0')] + iif2((s[2] = '1') and (s[3] > '0'), c11[ord(s[3])-ord('0')] +
          'надцать ', c10[ord(s[2])-ord('0')] + c1[woman, ord(s[3])-ord('0')]);
      end; {Num000toStr}
    
    function NumToStr(s: string): string; {Возвращает число прописью}
    var
      s000: string;
    
      isMinus: Boolean;
      isw:integer;
      i: integer; //Счётчик триплетов
    begin
    
      Result := '';
      i := 0;
       isMinus := (s <> '') and (s[1] = '-');
    
      if isMinus then
        s := Copy(s, 2, Length(s) - 1);
      while not ((i >= Ceil(Length(s) / 3)) or (i >= Max000)) do
      begin
        s000 := Copy('00' + s, Length(s) - i * 3, 3);
        isw := c1000w[i];
        if (i > 0) and (s000 <> '000') then //тысячи и т.д.
          Result := c1000[i] + w[Isw, strtoint(iif2(s000[2] = '1', '0', s000[3]))] + Result;
        Result := Num000toStr(s000, isw) + Result;
        Inc(i)
      end;
      if Result = '' then
        Result := 'ноль ';
      if isMinus then
        Result := 'минус ' + Result;
    end; {NumToStr}
    
    function TrimLeft(const S: string): string;
    var
      I, L: Integer;
    begin
      L := Length(S);
      I := 1;
      while (I <= L) and (S[I] <= ' ') do Inc(I);
      Result := Copy(S, I, 32565555);
    end;
    
    function RealToRouble(c: Extended): string;
    
    
      function ending(const s: string): Char;
      var
        l: Integer; //С l на 8 байт коротче $50->$48->$3F
      begin //Возвращает индекс окончания
    
        l := Length(s);
         if(l > 1) and (s[l-1]='1') then
         result:='0'
        else
        result:=s[l];
    
      end;
    
    var
      rub: string;
      kop: string;
      h,x:integer;
    begin {Возвращает число прописью с рублями}
    
      Result:=formatfloat('0.00',c);
      h:=length(Result);
      for X:=h to 18 do Result:=' '+Result;
      //Str(c: MaxPosition + 3: 2, Result);
    
      if Pos('E', Result) = 0 then //Если число можно представить в строке <>1E+99
      begin
        rub := TrimLeft(Copy(Result, 1, Length(Result) - 3));
        kop := Copy(Result, Length(Result) - 1, 2);
        Result := NumToStr(rub) + 'белорусск' + belarus[strtoint(ending(rub))] + ' рубл'+ruble[strtoint(ending(rub))];
        Result := UpperCase(Result[1]) + Copy(Result, 2, Length(Result) - 1);
    
      end;
    end;
    function GetSummaToText(r:real):string;
    begin
    initalize;
    result:=RealToRouble(r);
    end;
    
    ///======================================================================================
    ///======================================================================================
    
  • отредактировано 13:45
    Создайте и зарегистрируйте в скрипте функцию, которая будет преобразовывать число в текст (сумму прописью) и далее пользуйтесь ею во всех отчётах, а не городите в каждом отчёте огромный скрипт, как подсказал предыдущий оратор
  • отредактировано September 2015
    Вот архив. https://yadi.sk/d/wBym8T7WjQsmu
    В нем 2 файла. Кладешь их НАПРИМЕР (как у меня ....\Delphi7\lib) в папку общедоступную для Ваших проектов.
    В проекте прописываешь

    ...
    uses ..., MyFunctionsF3, ...
    ...

    И все. В генераторе отчета появляется такая функция

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.