Delphi 格式字符串 - 宽度和精度值的限制?

Delphi Format Strings - limits for width and precision values?

这条语句(在Delphi7)

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 时,前导零的填充变为前导空格。帮助说 "If the format string contains a precision specifier, it indicates that the resulting string must contain at least the specified number of digits; if the value has less digits, the resulting string is left-padded with zeros."

是否有另一种方法来格式化带有前导零的 20 个字符的整数?

Integer 值的精度限制为最多 16 位。如果指定的精度大于 16,则使用 0。这不是错误,它是硬编码逻辑,没有记录。

您可以通过两种方式处理此问题:

  1. 使用 Int64 而不是 IntegerInt64 的精度最多为 32 位:

    WriteLn(logfile, Format('%20.20d %s', [Int64(FileInfo.Size), full_name]);
    

    注意:在 Delphi 2006 年及以后,TSearchRec.SizeInt64。在早期版本中,它是 Integer,因此限制为 2GB。如果您需要在早期版本中处理大于 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;
    
  2. Integer 转换为不带任何前导零的字符串,然后使用 StringOfChar() 预先添加任何所需的零:

    s := IntToStr(FileInfo.Size);
    if Length(s) < 20 then
      s := StringOfChar('0', 20-Length(s)) + s;
    WriteLn(logfile, s + ' ' + full_name);