Число строкой VII
Здравствуйте Валентин.
Честно, давно ждал подобного журнала в электронном виде. Решил послать своё творчество которое уже немало отработало, опять же, преобразование числа в пропись, отличающееся от опубликованных программок тем, что слова для прописи хранятся в отдельном файле (lang.cnf), по аналогии с подуктами 1C. Это позволяет изменять национальную валюту.
Если поэкспериментировать, с массивом Univer, в котором хранятся окончания, можно добиться преобразования для многих языков, не сказал ли я чего лишнего. :)
Надеюсь, моя версия Вам понравится.
С наилучшими пожеланиями,
Панченко Сергей
Казахстан, Алматы,
Sergey@arna.kz
BuchUtil.pas
unit BuchUtil; interface uses IniFiles, SysUtils; function DoubleChar(ch: string): string; function NumToSampl(N: string): string; function MoneyToSampl(M: Currency): string; procedure LexemsToDim(fstr: string; var dim: array of string); var NameNum: array[0..9, 1..4]of string;//массив имён чиселExt: array[0..4, 1..3]of string; //массив расшиений (тысячи, миллионы ...)Univer: array[1..9, 1..4]of integer;//массив окончанийRubl: array[1..3]of String; //массив имен рублейCop: array[1..3]of String; //массив имен копеекZero: string; //название нуляOne: string; //единица "одна"Two: string; //двойка "две"fFile: TIniFile; //файл, откуда загружается прописьfString: string;fDim: array [0..9] of string;i: integer; implementation {заполняет массив Dim лексемами} procedure LexemsToDim(fstr: string; var dim: array of string); var i, j: integer;flex: string;begin if Length(fstr)>0 thenbegini:=1;j:=0;while i-1<Length(fstr) dobeginif fstr[i]=',' thenbegindim[j]:=flex+' ';inc(j);flex:='';endelseflex:=flex+fstr[i];inc(i);end;end;end; {преобразует число в пропись процедура использует файл lang.cnf} function NumToSampl(N: string): string; var k, i, i_indx: integer;number, string_num: string;index: integer;pos: integer;fl_ext: boolean;begin fl_ext:=true;i:=1;String_num:='';number:=Trim(N);k:=length(number);if (k=1)and(number='0')then String_num:=Zero else begin pos:=0;while (k>0) do beginif (k<>1)and(i=1)and(length(number)<>1)and(copy(number,k-1,1)='1')and(copy(number,k,1)<>'0') then beginindex:=StrToInt(copy(number,k,1));dec(k);inc(i);i_indx:=4;endelse beginindex:=StrToInt(copy(number,k,1));i_indx:=i;end;if (NameNum[index,i_indx]<>'')and(fl_ext=true)then beginString_num:=Ext[pos,Univer[index,i_indx]]+String_num;fl_ext:=false;end; if (index=1)and(pos=1)and(i=1)thenString_num:=One+String_numelse if (index=2)and(pos=1)and(i=1)thenString_num:=Two+String_numelseString_num:=NameNum[index,i_indx]+String_num;inc(i);if i=4 then begini:=1;inc(pos);fl_ext:=trueend;dec(k);end;end; if Trim(String_Num)<>'' thenbeginString_num[1]:=CHR(ORD(String_num[1])-32);Result:=String_num;end;end; {Преобразует х в 0х} function DoubleChar(ch: string): string; begin if Length(ch)=1 thenResult:='0'+chelseResult:=ch;end; {преобразует денежную сумму в пропись} function MoneyToSampl(M: Currency): string; var Int_Part, idx, idxIP, idxRP: integer;Int_Str, Real_Part, Sampl: string;begin Int_Part:=Trunc(Int(M));Int_Str:=IntToStr(Int_Part);Real_Part:=DoubleChar(IntToStr(Trunc(Int((M-Int_Part+0.001)*100))));Sampl:=NumToSampl(Int_Str);idx:=StrToInt(Int_Str[Length(Int_Str)]);if idx=0 then idx:=5;idxIP:=Univer[idx, 1];idx:=StrToInt(Real_Part[Length(Real_Part)]);if idx=0 then idx:=5;idxRP:=Univer[idx, 1];Result:=Sampl+Rubl[idxIP]+Real_Part+' '+Cop[idxRP];end; Initialization {Предположим файл находится на C:\ диске}fFile:=TIniFile.Create('c:\lang.cnf');try{Заполнение массива рублей}fString:=fFile.ReadString('Money', 'Rub', ',');LexemsToDim(fString, Rubl); {Заполнение массива копеек}fString:=fFile.ReadString('Money', 'Cop', ',');LexemsToDim(fString, Cop); {Заполнение массива чисел}fString:=fFile.ReadString('Nums', 'Numbers', ',');LexemsToDim(fString, fdim);NameNum[0, 1]:='';for i:=1 to 9 doNameNum[i, 1]:=fdim[i-1]; {Заполнение массива десятков}fString:=fFile.ReadString('Nums', 'Tens', ',');LexemsToDim(fString, fdim);NameNum[0, 2]:='';for i:=1 to 9 doNameNum[i, 2]:=fdim[i-1]; {Заполнение массива сотен}fString:=fFile.ReadString('Nums', 'Hundreds', ',');LexemsToDim(fString, fdim);NameNum[0, 3]:='';for i:=1 to 9 doNameNum[i, 3]:=fdim[i-1]; {Заполнение массива чисел после десяти}fString:=fFile.ReadString('Nums', 'AfterTen', ',');LexemsToDim(fString, fdim);NameNum[0, 4]:='';for i:=1 to 9 doNameNum[i, 4]:=fdim[i-1]; {Заполнение расширений чисел}Ext[0,1]:='';Ext[0,2]:='';Ext[0,3]:=''; {Тысячи}fString:=fFile.ReadString('Nums', 'Thou', ',');LexemsToDim(fString, fdim);for i:=1 to 3 doExt[1, i]:=fdim[i-1]; {Миллионы}fString:=fFile.ReadString('Nums', 'Mill', ',');LexemsToDim(fString, fdim);for i:=1 to 3 doExt[2, i]:=fdim[i-1]; {Миллиарды}fString:=fFile.ReadString('Nums', 'Bill', ',');LexemsToDim(fString, fdim);for i:=1 to 3 doExt[3, i]:=fdim[i-1]; {Триллион}fString:=fFile.ReadString('Nums', 'Thrill', ',');LexemsToDim(fString, fdim);for i:=1 to 3 doExt[4, i]:=fdim[i-1]; Zero:=fFile.ReadString('Nums', 'Zero', '0');if Zero[Length(Zero)]=',' thenZero:=Copy(Zero, 1, Length(Zero)-1)+' '; One:=fFile.ReadString('Nums', 'One', '1');if One[Length(One)]=',' thenOne:=Copy(One, 1, Length(One)-1)+' '; Two:=fFile.ReadString('Nums', 'Two', '0');if Two[Length(Two)]=',' thenTwo:=Copy(Two, 1, Length(Two)-1)+' '; {Заполнение таблицы окончаний}Univer[1,1]:=1; Univer[1,2]:=2; Univer[1,3]:=2; Univer[1,4]:=2;Univer[2,1]:=3; Univer[2,2]:=2; Univer[2,3]:=2; Univer[2,4]:=2;Univer[3,1]:=3; Univer[3,2]:=2; Univer[3,3]:=2; Univer[3,4]:=2;Univer[4,1]:=3; Univer[4,2]:=2; Univer[4,3]:=2; Univer[4,4]:=2;Univer[5,1]:=2; Univer[5,2]:=2; Univer[5,3]:=2; Univer[5,4]:=2;Univer[6,1]:=2; Univer[6,2]:=2; Univer[6,3]:=2; Univer[6,4]:=2;Univer[7,1]:=2; Univer[7,2]:=2; Univer[7,3]:=2; Univer[7,4]:=2;Univer[8,1]:=2; Univer[8,2]:=2; Univer[8,3]:=2; Univer[8,4]:=2;Univer[9,1]:=2; Univer[9,2]:=2; Univer[9,3]:=2; Univer[9,4]:=2;finallyfFile.Free;end; end. |
Lang.cnf
[Nums] Numbers=один,два,три,четыре,пять,шесть,семь,восемь,девять, One=одна, Two=две, Tens=десять,двадцать,тридцать,сорок,пятьдесят,шестьдесят,семьдесят,восемьдесят,девяносто, Hundreds=сто,двести,триста,четыреста,пятьсот,шестьсот,семьсот,восемьсот,девятьсот, AfterTen=одиннадцать,двенадцать,тринадцать,четырнадцать,пятнадцать,шестнадцать,семнадцать,восемнадцать,девятнадцать, Zero=ноль, Thou=тысяча,тысяч,тысячи, Mill=миллион,миллионов,миллиона, Bill=миллиард,миллиардов,миллиарда, Thrill=триллион,триллионов,триллиона, [Money] Rub=рубль,рублей,рубля, Cop=копейка,копеек,копейки, |
[000562]