avmaksimov писал(а):А почему вы используете массивы, а не используете код символа?
Да я бы со всем моим удовольствием, а какой код будет у символа '42'?
Модератор: Модераторы
avmaksimov писал(а):А почему вы используете массивы, а не используете код символа?
RRYTY писал(а):Почему не засунуть в Format extended, а не int64?
iskander писал(а):avmaksimov писал(а):А почему вы используете массивы, а не используете код символа?
Да я бы со всем моим удовольствием, а какой код будет у символа '42'?
avmaksimov писал(а):В смысле? Вы же по одному символу разбираете.
...
type
TChar2 = array[0..1] of Char;
...
iskander писал(а):avmaksimov писал(а):В смысле? Вы же по одному символу разбираете.
- Код: Выделить всё
...
type
TChar2 = array[0..1] of Char;
...
Вот как это сможет быть одним символом?
avmaksimov писал(а):Вы не пробовали коммитить на GitLab решение в RTL?
avmaksimov писал(а):Если ваше решение, возможно, немного адаптировав, добавлю в https://github.com/doublecmd, вы не против?
iskander писал(а):avmaksimov писал(а):Вы не пробовали коммитить на GitLab решение в RTL?
Да упаси меня господь.
// свободная лицензия 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;
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
avmaksimov писал(а):А если я?) Не тщеславия ради, но популярности Паскала для))
avmaksimov писал(а):...
Суть проблемы в том, что максимальное значение Int64 - 9 223 372 036 854 775 807, а при любом преобразовании в число с плавающей точкой цифра 7 пропадает и остаётся только: 9 223 372 036 854 775 800 ...
procedure TMF.Button1Click(Sender: TObject);
var
b_i: Int64;
b_e: extended;
begin
If TryStrToInt64 (MF.Edit1.Text, b_i) then
begin
b_e:= b_i;
MF.Label1.Caption:= Format ('%n', [b_e]);
end;
end;
RRYTY писал(а):avmaksimov писал(а):...
Суть проблемы в том, что максимальное значение Int64 - 9 223 372 036 854 775 807, а при любом преобразовании в число с плавающей точкой цифра 7 пропадает и остаётся только: 9 223 372 036 854 775 800 ...
Не могу воспроизвести косяк - семерка не потерялась.
- Код: Выделить всё
procedure TMF.Button1Click(Sender: TObject);
var
b_i: Int64;
b_e: extended;
begin
If TryStrToInt64 (MF.Edit1.Text, b_i) then
begin
b_e:= b_i;
MF.Label1.Caption:= Format ('%n', [b_e]);
end;
end;
avmaksimov писал(а):Это Винда? Похоже на Гном) Я писал, что проблема только в Windows (10).
function IntToStrTSvMove(const AValue: SizeUInt): shortstring;
var
i,j, vSrcLen, vSCount, vResLen:Byte;
STmp: shortstring;
begin
Str(AValue, STmp);
vSrcLen := Length(STmp);
vSCount := ((vSrcLen - 1) div 3);
vResLen := vSrcLen + vSCount;
Result[0]:=Chr(vResLen);
for I := 1 to vSCount do begin
J:=i shl 2;
Move(STmp[vSrcLen - (j-i) + 1], Result[vResLen - j + 2], 3); // ???
Result[vResLen - j+1] := FormatSettings.ThousandSeparator;
end;
Move(STmp[1], Result[1], vSrcLen - vSCount*3);
end;
IntToStrTSv1: 5984
3 944 166 137
IntToStrTSv2: 1547
3 944 166 137
IntToStrTSvMove: 1562
3 944 166 137
IntToStrTSv1: 4282
3 849 148 015 466 334 344
IntToStrTSv2: 2391
3 849 148 015 466 334 344
IntToStrTSvMove: 2531
3 849 148 015 466 334 344
IntToStrTSv1: 3422
5 457 206 742 568 232 034
IntToStrTSv2: 2281
5 457 206 742 568 232 034
IntToStrTSvMove: 2328
5 457 206 742 568 232 034
Alex2013 писал(а):Почти догнал лидера !
Seenkao писал(а):какого лидера? ))) там вроде как уже был обгон лидера. ))) С полной заменой функции "str".
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11