本声明(在Delphi 7中)
writeln(logfile,format('%16.16d ',[FileInfo.size])+full_name);
导致此输出
0000000021239384 C:\DATA\DELPHI\sxf_archive10-13.zip
本声明
writeln(logfile,format('%17.17d ',[FileInfo.size])+full_name);
导致此输出
21239384 C:\DATA\DELPHI\sxf_archive10-13.zip
当精度说明符大于16时,带前导零的填充更改为前导空格。帮助说"如果格式字符串包含精度说明符,则表示结果字符串必须至少包含指定的数字数字;如果值的位数较少,则生成的字符串将用零填充。"
是否有另一种方法可以使用前导零格式化20个字符的整数?
答案 0 :(得分:5)
Integer
值的精度限制为最多16位。如果指定的Precision大于16,则使用0代替。这不是一个错误,它是硬编码的逻辑,并没有记录。
有两种方法可以解决这个问题:
使用Int64
代替Integer
。 Int64
的精度最多为32位:
WriteLn(logfile, Format('%20.20d %s', [Int64(FileInfo.Size), full_name]);
注意:在Delphi 2006及更高版本中,TSearchRec.Size
是Int64
。在早期版本中,它是Integer
,因此限制为2GB。如果您需要处理文件大小>在早期版本中,您可以从TSearchRec.FindData
字段获得完整的64位大小:
var
FileSize: ULARGE_INTEGER;
begin
FileSize.LowPart := FileInfo.FindData.nFileSizeLow;
FileSize.HighPart := FileInfo.FindData.nFileSizeHigh:
WriteLn(logfile, Format('%20.20d %s', [FileSize.QuadPart, full_name]);
end;
将Integer
转换为不带任何前导零的字符串,然后使用StringOfChar()
添加任何必需的零:
s := IntToStr(FileInfo.Size);
if Length(s) < 20 then
s := StringOfChar('0', 20-Length(s)) + s;
WriteLn(logfile, s + ' ' + full_name);