2016-10-22 5 views
2

Это утверждение (в Delphi 7)Строки формата Delphi - пределы для значений ширины и точности?

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

Precision из Integer значения ограниченно до 16 цифр .. макс Если заданная точность больше, чем 16, 0 используются вместо Это не ошибки, это жестко закодированы логики, и не документировано

есть два способа справиться с этим:.

  1. использовать Int64 вместо Integer. Точность для Int64 32 цифр макс:

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

    Примечание: В Delphi 2006 и более поздних версий, TSearchRec.Size является Int64. В более ранних версиях это вместо Integer и, следовательно, ограничено 2 ГБ. Если вам нужно обрабатывать размеры файлов> 2 Гб в более ранних версиях, вы можете получить полный размер 64-битного от TSearchRec.FindData полей:

    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 бит, это в конечном итоге потерпело бы неудачу в файле> 2 ГБ. Когда я добавил блок «windows» в список использования для типа ULARGE_INTEGER, это вызвало ошибку в другом месте в «Findclose». Мне пришлось отслеживать, что подразделение Windows определяет другую процедуру findclose, поэтому мне пришлось изменить свое использование на Sysutils.findclose. – tim11g