Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга о KOL.doc
Скачиваний:
29
Добавлен:
30.04.2019
Размер:
1.77 Mб
Скачать

2.2. Работа с длинными целыми числами (i64 против Int64)

В Delphi, начиная с версии 5, появился тип данных Int64, для работы с 8-байтными целыми числами. Но в более ранних версиях Delphi этого типа данных не было. Для того, чтобы возможно было с ними работать и в старших версиях Delphi, в KOL вводится свой собственный тип данных I64 и разработан набор функций для работы с этим типом данных:

MakeInt64( lo, hi ): I64 - формирует длинное целое число из двух обычных целых чисел;

Int2Int64( i ): I64 - "приводит" тип данных целое к длинному целому (эквивалентен вызову MakeInt64( i, 0 ) );

IncInt64( I, delta ) - увеличивает I:I64 на целое число delta;

DecInt64( I, delta ) - уменьшает I:I64 на delta;

Add64( I1, I2 ) - складывает два числа типа I64;

Sub64( I1, I2 ) - вычитает I2 из I1;

Neg64( I ) - возвращает -I;

Mul64i( I, i ) - умножает удвоенное целое I на обычное целое i;

Div64i( I, i ) - делит удвоенное целое на обычное целое;

Mod64i( I, i ) - вычисляет остаток от деления I на i;

Sgn64i( I ) - возвращает "знак" числа I (т.е. -1, если I отрицательное, 0, если I=0, или 1, если I > 0);

Cmp64( I1, I2 ) - сравнивает два удвоенных целых (так же возвращает -1, 0, 1, в зависимости от того, меньше первый параметр второго, они равны или первый больше второго);

Int64_2Str( I ) - конвертирует удвоенное целое в строку;

Str2Int64( s ) - конвертирует число в строковом представлении в удвоенное целое;

Int64_2Double( I ) - конвертирует удвоенное целое в число с плавающей запятой;

Double2Int64( d ) - конвертирует число с плавающей запятой в удвоенное целое.

Никто не мешает, тем не менее, использовать встроенный в Delphi младших версий тип данных Int64 (но для преобразования таких чисел в строку и обратно я рекомендую все-таки использовать функции Int64_2Str, Str2Int64, выполняя соответствующие приведения типа данных). Использование прочих вышеуказанных функций имеет смысл, только если проект разрабатывается на Delphi 3 или 2.

2.3. Преобразования чисел с плавающей запятой. Математика с числами с плавающей запятой

Для того, чтобы не было необходимости подключать модуль SysUtils, в KOL введен набор функций для преобразования чисел с плавающей запятой в строку и обратно. (Обычные операции с плавающей запятой специальных функций или подключения модуля SysUtils не требуют). Это следующие функции: Str2Double( s ), Double2Str( d ), Str2Extended( s ), Extended2Str( e ).

Кроме того, KOL включает пару функций из раздела математики, которые используются в нем самом, это IntPower( i, n ), и IsNAN( d ), а так же константу NAN, обозначающую невозможное число с плавающей запятой (равное неопределенности 0/0). Прочие математические функции (тригонометрия, логарифмы, поиск максимального, минимального числа в массиве, суммирование, статические и экономические функции), аналогичные стандартным, вынесены в отдельный модуль kolmath.pas (при его включении к проекту так же добавляется модуль err.pas, который используется для поддержки обработки исключений, и увеличивает вес приложения примерно на 6 Кбайт).

2.4. Работа с датой и временем в kol

В стандартном модуле SysUtils из Delphi VCL объявляется тип данных TDateTime. Фактически он эквивалентен числу с плавающей запятой двойной точности. В его целой части хранится день, в дробной части - время дня как дробная часть суток, считая сутки единицей. Аналогично типу данных TDateTime в VCL (модуль SysUtils), в KOL вводится свой тип данных TDateTime. С той разницей, что если SysUtils.TDateTime как число с плавающей запятой считает в своей целой части дни от 31 декабря 1899 года, в KOL.TDateTime отсчет начинается от даты 1 января 1 года нашей эры (эры "от рождества Христова") - по Григорианскому календарю. Я сделал так потому, что считаю этот тип данных удобным не только для связи с SQL-серверами, разработчики стандартов для которых решили, что раньше XX века ничего не было такого, что можно было бы посчитать. (На моем сайте есть модуль calenadae.pas, который может использоваться для астрономических, исторических и астрологических расчетов, для пересчета в различные календарные системы, расчета пасхальных дат и т.п.)

Если же кому-то нужна совместимость с SysUtils.TDatetime, то для преобразования из KOL'овской даты в VCL'евскую достаточно прибавить константу VCLDate0 (равную 693 594, т.е. числу дней от 1 января 1 года до 31 декабря 1899 года), а для обратного преобразования - вычесть эту же константу. Для удобства конвертирования, такая константа декларирована в KOL под именем VCLDate0.

Набор функций для работы с датами и временем несколько отличается от того, который имеется в SysUtils:

Now - возвращает текущую системную дату и время;

Date - возвращает сегодняшнюю дату (отбрасывая время);

DecodeDate( d, Y, M, D ) - декодирует дату;

DecodeDateFully( d, Y, M, DW, D) - декодирует дату (и день недели);

DayOfWeek( D ) - декодирует только день недели;

EncodeDate( Y, M, D, T ) - кодирует дату и время;

SystemTime2DateTime( ST, D ) - преобразует структуру TSystemTime в TDateTime;

DateTime2SystemTime( D, ST ) - выполняет обратное преобразование;

Date2StrFmt( s, D ) - форматирует дату в строку;

Time2StrFmt( s, D ) - форматирует время в строку;

DateTime2StrShort( D ) - форматирует дату в строку используя короткий системный формат по умолчанию;

Str2DateTimeFmt( s1, s2 ) - считывает дату и время из строки по указанному формату;

Str2DateTimeShort( s ) - аналогично предыдущей функции, но используется системный формат по умолчанию;

Str2DateTimeShortEx( s ) - дополнительно к предыдущей функции использует разделители (зависящие от региональных настроек системы), чтобы не перепутать дату с временем.

Кроме работы с типом TDateTime, в KOL имеется ряд функций для работы со структурой TSystemTime непосредственно через API (числа с плавающей запятой не используются в этом случае):

CompareSystemTime( ST1, ST2 ) - сравнивает две даты (структуры типа TSystemTime), и возвращает -1, 0, или 1, в зависимости от результата сравнения;

IncDays( ST, n ) - увеличивает дату на указанное число дней (если n < 0, то уменьшает);

IncMonths( ST, n ) - увеличивает дату на указанное число месяцев (при n < 0 выполняет уменьшение);

SystemDate2Str( ST, localeID, dfltDateFmt, s ) - форматирует дату в соответствии с заданными параметрами;

SystemTime2Str( ST, localeID, flgs, s ) - форматирует время в соответствии с заданными параметрами.