Я постарался сделать свою оптимизированную функцию. В принципе, внутри ей пофигу на тип, но делать такое странное форматирование строки было бы ещё более странным. Тем не менее, для популяризации языка, считаю, что данная функция должна быть must have. Одно дело, когда округляется число с дробной частью, а другое, когда целое число рубится. Нужно было для списка файлов и размеров файлов для "Double Commander".
Надеюсь, кому-то ещё понадобится, даже, если и не добавят в RTL.
- Код: Выделить всё
function IntToStrTS(const AValue: SizeUInt): string;
var i, vSrcLen, vSrcI, vSrcNumberNo, vResLen: byte;
begin
Str(AValue, Result);
vSrcLen := Result.Length;
vResLen := vSrcLen + ((vSrcLen - 1) div 3);
SetLength(Result, vResLen);
vSrcI := vResLen;
vSrcNumberNo := 1;
for i:= vSrcLen downto 1 do
begin
Result[vSrcI] := Result[i];
Dec(vSrcI);
if(vSrcNumberNo <> vSrcLen) and (vSrcNumberNo mod 3 = 0) then
begin
Result[vSrcI] := FormatSettings.ThousandSeparator;
Dec(vSrcI);
end;
Inc(vSrcNumberNo);
end;
end;
Добавлено спустя 9 часов 19 минут 7 секунд:Re: Конвертация Int64 с разделителем групп разрядов: неужели?!)Эх.. Предложил на FPC и один из собратьев предложил похожий модуль:
http://svn.code.sf.net/p/flyingsheep/code/trunk/MijnLib/fsiconv.pp. Надеюсь, тоже кому-то будет полезен.
Там использован похожий алгоритм). Наверное, это более оптимальный, чем в RTL при форматировании строки с множеством Insert'ов, что вызовет копирование строки на каждый такой запрос (.