Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.05.24;
Скачать: CL | DM;

Вниз

Conversions   Найти похожие ветки 

 
Jon ©   (2008-01-18 04:46) [0]

I notice that there are several conversions missing in KOL.
Can I request that they are added to make the library more complete.

Some that I can think of are:

Hex2Int64,
Rome2Int,
Int64_2Rome,
Rome2Int64,
Int2Octal,
Octal2Int64
Int64_2Octal,
Int2Binary,
Binary2Int64
Int64_2Binary

There are probably more...

The above have at least one direction of conversion currently implemented in KOL.PAS


 
=BuckLr= ©   (2008-01-18 14:04) [1]

I quite agree with you...
Поддерживаю Jon"а!


 
Vladimir Kladov ©   (2008-01-19 10:50) [2]

Rome2Int64 not necessary still T=10000 and it is very hard to take a big enough number in Rome numbers.


 
D[u]fa   (2008-01-19 13:36) [3]

раз поддерживаете, то напишите, а их добавят


 
=BuckLr= ©   (2008-01-20 11:02) [4]


> напишите, а их добавят

Не вопрос, но точно ли добавят? Может, аффтар против... Вот и спрашиваем сначала


 
Vladimir Kladov ©   (2008-01-20 11:36) [5]

добавлю. Просто я обычно сам делаю то, что мне самому понадобилось. Можно было бы оставлять в отдельном модуле, но это неразумно: Delphi для каждого модуля добавляет 56 байт кода, если модулей много, это выливается. Оставлять опять же только для себя неразумно: чем больше народу протетирует, тем больше ошибок выловится. А добавлять просто для полноты коллекции, пока оно не понадобилось - тоже не очень разумно: протестировать будет некому, и годами в модуле будет лежать непроверенный и наверняка ошибочный кусок кода. Так что пишите, тестируйте - добавим.


 
engine ©   (2008-01-20 18:05) [6]

Вот написал, если кому потребуется сиё творение.
Работает правда только с положительными числами

unit Conversions;

interface

function IntToHex(Src: LongWord): String;
function IntToOct(Src: LongWord): String;
function IntToBinary(Src: LongWord): String;
function HexToInt(Src : String) : LongWord;
function OctToInt(Src : String) : LongWord;
function BinToInt(Src : String) : LongWord;

implementation

function IntToHex(Src: LongWord): String;
const DICT = "0123456789ABCDEF";
begin
 Result := "";
 repeat
   Result := DICT[(Src mod 16) + 1] + Result;
   Src := Src div 16;
 until (Src div 16) = 0;
 Result := DICT[(Src mod 16) + 1] + Result;
end;

function IntToOct(Src: LongWord): String;
const DICT = "01234567";
begin
 Result := "";
 repeat
   Result := DICT[(Src mod 8) + 1] + Result;
   Src := Src div 8;
 until (Src div 8) = 0;
 Result := DICT[(Src mod 8) + 1] + Result;
end;

function IntToBinary(Src: LongWord): String;
const DICT = "01";
begin
 Result := "";
 repeat
   Result := DICT[(Src mod 2) + 1] + Result;
   Src := Src div 2;
 until (Src div 2) = 0;
 Result := DICT[(Src mod 2) + 1] + Result;
end;

function HexToInt(Src : String) : LongWord;
const DICT = "0123456789ABCDEF";
var i : Integer;
begin
 Result := 0;
 for i := 1 to Length(Src)-1 do
 begin
   Result := (Result + (pos(Src[i],DICT) — 1)) * 16;
 end;
 Result := Result + pos(Src[Length(Src)],DICT) —1;
end;

function OctToInt(Src : String) : LongWord;
const DICT = "01234567";
var i : Integer;
begin
 Result := 0;
 for i := 1 to Length(Src)-1 do
 begin
   Result := (Result + (pos(Src[i],DICT) — 1)) * 8;
 end;
 Result := Result + pos(Src[Length(Src)],DICT) —1;
end;

function BinToInt(Src : String) : LongWord;
const DICT = "01";
var i : Integer;
begin
 Result := 0;
 for i := 1 to Length(Src)-1 do
 begin
   Result := (Result + (pos(Src[i],DICT) — 1)) * 2;
 end;
 Result := Result + pos(Src[Length(Src)],DICT) —1;
end;

end.


 
engine ©   (2008-01-20 21:41) [7]

> [6] engine ©   (20.01.08 18:05)

Чтобы переводила отрицательные числа, добавляем такую строчку в начало функций IntToXXX:

if Src < 0 then Src := high(Src) &#151; Src;


 
=BuckLr= ©   (2008-01-20 22:03) [8]

IntToHex=Int2Hex


 
engine ©   (2008-01-21 00:42) [9]

> [8] =BuckLr= ©   (20.01.08 22:03)

Это единственное замечание к моим функциям?


 
Elec3C ©   (2008-01-21 14:14) [10]

Может деление лучше заменить на сдвиг вправо? Или нет?


 
Vladimir Kladov ©   (2008-01-21 16:09) [11]

Насколько я понял Jon"а его интересует int64. У нас уже есть Int2Hex (кстати, в нем есть полезная возможность сразу указать минимальное число цифр) и Hex2Int. Мой вариант будет такой:

function ToRadix( number: Radix_Int; radix: Integer; min_digits: Integer ): KOLString;
var Buf: array[ 0..64 ] of KOLChar;
   p: PKOLChar;
   n: Integer;
   numd: Extended;
begin
 Assert( (radix >= 2) and (radix <= 36), "Radix base must be between 2 and 36" );
 Assert( min_digits <= 64, "Maximum possible digits number is 64" );
   p := @ Buf[ 64 ];
   p^ := #0;
   while (number <> 0) do
   begin
       dec( p );
       {$IFDEF _D5orHigher}
       if number < 0 then
       begin
           numd := 1.0 * I64( number ).Hi * $100000000 + I64( number ).Lo;
           number := Round( numd / radix );
           n := Round( numd - 1.0 * number * radix );
           if n < 0 then
           begin
             n := radix + n;
             dec( number );
           end;
       end
         else
       {$ENDIF}
       begin
           n := number mod radix;
           number := number div radix;
       end;
       if n <= 9 then p^ := KOLChar( n + Ord( "0" ) )
       else p^ := KOLChar( n - 10 + Ord( "A" ) );
       dec( min_digits );
   end;
   while (min_digits > 0) do
   begin
       dec( p );
       p^ := "0";
       dec( min_digits );
   end;
   Result := p;
end;

function FromRadixStr( var Rslt: Radix_int; s: PKOLChar; radix: Integer ): PKOLChar;
var n: Integer;
begin
 Assert( (radix >= 2) and (radix <= 36), "Radix base must be between 2 and 36" );
   Rslt := 0;
   while s^ <> #0 do
   begin
       CASE s^ OF
       "0".."9": n := Ord( s^ ) - Ord( "0" );
       "a".."z": n := Ord( s^ ) - Ord( "a" ) + 10;
       "A".."Z": n := Ord( s^ ) - Ord( "A" ) + 10;
       else n := 100;
       END;
       if n >= radix then break;
       Rslt := Rslt * radix + n;
       inc( s );
   end;
   Result := s;
end;

function FromRadix( const s: String; radix: Integer ): Radix_int;
begin
   Result := 0;
   if s = "" then Exit;
   FromRadixStr( Result, @ s[ 1 ], radix );
end;



 
Vladimir Kladov ©   (2008-01-21 16:21) [12]

Да забыл при интерфейсные декларации

type Radix_int = {$IFDEF _D5orHigher} Int64 {$ELSE} Integer {$ENDIF};
function ToRadix( number: Radix_int; radix, min_digits: Integer ): String;
{* Converts unsigned number to string representing it literally in a numeric
  base given by radix parameter. }
function FromRadixStr( var Rslt: Radix_int; s: PKOLChar; radix: Integer ): PKOLChar;
{* Converts unsigned number from string representation in a numeric base given by
  a radix parameter. Returns a pointer to a character next to the last digit of
  the number. }
function FromRadix( const s: String; radix: Integer ): Radix_int;
{* Converts unsigned number from string representation in a numeric base given by
  a radix parameter. See also: FromRadixStr function. }


 
Jon ©   (2008-01-22 02:06) [13]


> engine

Good code - thanks.

> Vladimir Kladov

I respect the master! :-)



Страницы: 1 вся ветка

Текущий архив: 2009.05.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.016 c
15-1235573250
Dennis I. Komarov
2009-02-25 17:47
2009.05.24
delphimaster.ru :)


15-1237892901
alexander-rsh
2009-03-24 14:08
2009.05.24
Сохранени е в IniFile


2-1238999216
Дмитрий
2009-04-06 10:26
2009.05.24
Помогите обработать HResult


15-1237717805
Юрий
2009-03-22 13:30
2009.05.24
С днем рождения ! 22 марта 2009 воскресенье


2-1239343514
Гость
2009-04-10 10:05
2009.05.24
Работа с потоками.