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".
 Если сразу заменить "str", тогда разумеется можно сделать еще быстрее.
  Если сразу заменить "str", тогда разумеется можно сделать еще быстрее. )
  )Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: Yandex [Bot] и гости: 1