- Код: Выделить всё
// свободная лицензия ZLib. Просьба прикладывать к коду.
function IntToStrNew(Value: Int64): string;
var
_Res: array[0..25] of Char = (' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',
' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ');
__res: PChar;
i, j: QWord;
ii: Byte;
minus: boolean = false;
begin
if Value = 0 then
begin
Result := '0';
exit;
end;
__res := @_Res[25];
{$push}
{$Q-}{$R-}
j := 1;
if Value < 0 then
minus := true;
i := abs(Value);
while i > 999 do
begin
ii := i mod 10;
i := i div 10;
__res^ := char(ii + 48);
dec(__res);
ii := i mod 10;
i := i div 10;
__res^ := char(ii + 48);
dec(__res);
ii := i mod 10;
i := i div 10;
__res^ := char(ii + 48);
dec(__res, 2);
inc(j, 4);
end;
while i > 9 do
begin
ii := i mod 10;
i := i div 10;
__res^ := char(ii + 48);
dec(__res);
inc(j);
end;
__res^ := char(i + 48);
if minus then
begin
inc(j);
dec(__res);
__res^ := '-';
end;
SetLength(Result, j);
move(_Res[26 - j], Result[1], j);
{$pop}
end;
результат на 5 000 000 итераций (мой нижний), кодировка страницы UTF-8:
IntToStrTSv1: 1229
3 806 104 050 474 772 600
IntToStrTSv2: 646
3 806 104 050 474 772 600
IntToStrTSvMove: 1272
3 806 104 050 474 772 600
IntToStrNew: 508
3 806 104 050 474 772 600
Код свободный, мне не может принадлежать, так как часть кода взята у участников сообщества. За что им благодарность!
Данный код работает с Int64, как с положительными, так и с отрицательными числами.
Учтены проблемы с переводом чисел, при любой (надеюсь) кодировке страницы. Возможны проблемы при каких-то кодировках, но вроде все влияния на кодировку убрал. И, вероятно, код можно ещё ускорить. )))
Добавлено спустя 1 минуту 12 секунд:
Re: Конвертация Int64 с разделителем групп разрядов: неужели?!)
так глядишь займусь переводом в другие системы счисления... )))