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。这不是错误,它是硬编码逻辑,没有记录。
您可以通过两种方式处理此问题:
使用 Int64
而不是 Integer
。 Int64
的精度最多为 32 位:
WriteLn(logfile, Format('%20.20d %s', [Int64(FileInfo.Size), full_name]);
注意:在 Delphi 2006 年及以后,TSearchRec.Size
是 Int64
。在早期版本中,它是 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;
将 Integer
转换为不带任何前导零的字符串,然后使用 StringOfChar()
预先添加任何所需的零:
s := IntToStr(FileInfo.Size);
if Length(s) < 20 then
s := StringOfChar('0', 20-Length(s)) + s;
WriteLn(logfile, s + ' ' + full_name);
这条语句(在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。这不是错误,它是硬编码逻辑,没有记录。
您可以通过两种方式处理此问题:
使用
Int64
而不是Integer
。Int64
的精度最多为 32 位:WriteLn(logfile, Format('%20.20d %s', [Int64(FileInfo.Size), full_name]);
注意:在 Delphi 2006 年及以后,
TSearchRec.Size
是Int64
。在早期版本中,它是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;
将
Integer
转换为不带任何前导零的字符串,然后使用StringOfChar()
预先添加任何所需的零:s := IntToStr(FileInfo.Size); if Length(s) < 20 then s := StringOfChar('0', 20-Length(s)) + s; WriteLn(logfile, s + ' ' + full_name);