Пятница, 15 Ноя 2024, 08:41
Uchi.ucoz.ru
Меню сайта
Форма входа

Категории раздела
Высшая математика [11]
Экономическая социология [95]
Основы Менеджмента [64]
Бухгалтерский учёт [157]
Философия [163]
Мировая Экономика [603]
Бизнес планирование [29]
Финансирование и кредитование инвест [105]
Ценообразование [46]
Гражданское право [196]
Права Человека [173]
Основы Маркетинга [207]
Основы энергосбережения [55]
Информатика [0]
Экология и устойчивое развитие [0]
Физика для студентов [0]
Основы права [0]
Политология [0]
Не стандартные примеры на Delphi [169]
Примеры на Delphi7 [108]
Алгоритмы [94]
API [110]
Pascal [152]
Базы Данных [6]
Новости
Чего не хватает сайту?
500
Статистика
Зарегистрировано на сайте:
Всего: 51643


Онлайн всего: 71
Гостей: 71
Пользователей: 0
Яндекс.Метрика
Рейтинг@Mail.ru

Каталог статей


Главная » Статьи » Студентам » Алгоритмы

Число строкой VII
Честно, давно ждал подобного журнала в электронном виде. Решил послать своё
творчество которое уже немало отработало, опять же, преобразование числа в
пропись, отличающееся от опубликованных программок тем, что слова для прописи
хранятся в отдельном файле (lang.cnf), по аналогии с подуктами 1C. Это позволяет
изменять национальную валюту.

Если поэкспериментировать, с массивом Univer, в котором хранятся окончания,
можно добиться преобразования для многих языков, не сказал ли я чего лишнего. smile

Надеюсь, моя версия Вам понравится.

С наилучшими пожеланиями,

Панченко Сергей

Казахстан, Алматы,

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 then
begin
i:=1;
j:=0;
while i-1<Length(fstr)
do
begin
if fstr[i]=',' then
begin
dim[j]:=flex+' ';
inc(j);
flex:='';
end
else
flex:=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 begin
if (k<>1)and(i=1)and(length(number)<>1)and(copy(number,k-1,1)='1')
and(copy(number,k,1)<>'0') then begin
index:=StrToInt(copy(number,k,1));
dec(k);
inc(i);
i_indx:=4;
end
else begin
index:=StrToInt(copy(number,k,1));
i_indx:=i;
end;
if (NameNum[index,i_indx]<>'')and(fl_ext=true)then begin
String_num:=Ext[pos,Univer[index,i_indx]]+String_num;
fl_ext:=false;
end;

if (index=1)and(pos=1)and(i=1)then
String_num:=One+String_num
else if (index=2)and(pos=1)and(i=1)then
String_num:=Two+String_num
else
String_num:=NameNum[index,i_indx]+String_num;
inc(i);
if i=4 then begin
i:=1;
inc(pos);
fl_ext:=true
end;
dec(k);
end;end;

if Trim(String_Num)<>''
then
begin
String_num[1]:=CHR(ORD(String_num[1])-32);
Result:=String_num;
end;end;

{Преобразует х в 0х}
function DoubleChar(ch:
string): string;
begin

if Length(ch)=1 then
Result:='0'+ch
else
Result:=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 do
NameNum[i, 1]:=fdim[i-1];

{Заполнение массива десятков}
fString:=fFile.ReadString('Nums', 'Tens', ',');
LexemsToDim(fString, fdim);
NameNum[0, 2]:='';
for i:=1 to 9 do
NameNum[i, 2]:=fdim[i-1];

{Заполнение массива сотен}
fString:=fFile.ReadString('Nums', 'Hundreds', ',');
LexemsToDim(fString, fdim);
NameNum[0, 3]:='';
for i:=1 to 9 do
NameNum[i, 3]:=fdim[i-1];

{Заполнение массива чисел после
десяти}
fString:=fFile.ReadString('Nums', 'AfterTen', ',');
LexemsToDim(fString, fdim);
NameNum[0, 4]:='';
for i:=1 to 9 do
NameNum[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 do
Ext[1, i]:=fdim[i-1];

{Миллионы}
fString:=fFile.ReadString('Nums', 'Mill', ',');
LexemsToDim(fString, fdim);
for i:=1 to 3 do
Ext[2, i]:=fdim[i-1];

{Миллиарды}
fString:=fFile.ReadString('Nums', 'Bill', ',');
LexemsToDim(fString, fdim);
for i:=1 to 3 do
Ext[3, i]:=fdim[i-1];

{Триллион}
fString:=fFile.ReadString('Nums', 'Thrill', ',');
LexemsToDim(fString, fdim);
for i:=1 to 3 do
Ext[4, i]:=fdim[i-1];

Zero:=fFile.ReadString('Nums', 'Zero', '0');
if Zero[Length(Zero)]=','
then
Zero:=Copy(Zero, 1, Length(Zero)-1)+' ';

One:=fFile.ReadString('Nums', 'One', '1');
if One[Length(One)]=','
then
One:=Copy(One, 1, Length(One)-1)+' ';

Two:=fFile.ReadString('Nums', 'Two', '0');
if Two[Length(Two)]=','
then
Two:=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;
finally
fFile.Free;
end;
end.
Категория: Алгоритмы | Добавил: Lerka (21 Ноя 2012)
Просмотров: 611 | Рейтинг: 1.0/ 6 Оштрафовать | Жаловаться на материал
Похожие материалы
Всего комментариев: 0

Для блога (HTML)


Для форума (BB-Code)


Прямая ссылка

Профиль
Пятница
15 Ноя 2024
08:41


Вы из группы: Гости
Вы уже дней на сайте
У вас: непрочитанных сообщений
Добавить статью
Прочитать сообщения
Регистрация
Вход
Улучшенный поиск
Поиск по сайту Поиск по всему интернету
Наши партнеры
Интересное
Популярное статьи
Портфолио ученика начальной школы
УХОД ЗА ВОЛОСАМИ ОЧЕНЬ ПРОСТ — ХОЧУ Я ЭТИМ ПОДЕЛИТ...
Диктанты 2 класс
Детство Л.Н. Толстого
Библиографический обзор литературы о музыке
Авторская программа элективного курса "Практи...
Контрольная работа по теме «Углеводороды»
Поиск
Главная страница
Используются технологии uCoz