2016-10-22 58 views
2

本聲明(在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個字符的整數?

回答

5

精密的Integer值的限制爲16位。最大值如果指定的精度大於16,0代替這是不是一個錯誤,這是硬編碼的邏輯,而不是記錄

有兩種方法可以處理這個問題:。

  1. 使用Int64而不是Integer。精度爲Int64是32個位數最大:

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

    注:在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); 
    
+0

謝謝!這是做到這一點的正確方法 - 如果我沒有做到64位的大小,它最終會在> 2GB的文件上失敗。當我將「windows」單元添加到ULARGE_INTEGER類型的使用列表中時,它在「Findclose」的其他地方導致了錯誤。我不得不跟蹤Windows單元定義了一個不同的findclose過程,所以我必須將我的用法更改爲Sysutils.findclose。 – tim11g