【问题标题】:Delphi Format Strings - limits for width and precision values?Delphi 格式字符串 - 宽度和精度值的限制?
【发布时间】:2017-03-05 00:18:52
【问题描述】:

此语句(在 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 个字符的整数吗?

【问题讨论】:

    标签: delphi formatting delphi-7 number-formatting


    【解决方案1】:

    Integer 值的精度限制为最多 16 位。如果指定的 Precision 大于 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);
      

    【讨论】:

    • 谢谢!这是执行此操作的正确方法 - 如果我没有将大小设置为 64 位,它最终会在 >2GB 文件上失败。当我将“windows”单元添加到 ULARGE_INTEGER 类型的使用列表中时,它在“Findclose”的其他地方引起了错误。我必须追查到 Windows 单元定义了不同的 findclose 过程,所以我不得不将我的用法更改为 Sysutils.findclose。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 2020-02-04
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多