2016-10-22 2 views
2

Cette déclaration (en Delphi 7)Delphi Format Strings - limites pour les valeurs de largeur et de précision?

writeln(logfile,format('%16.16d ',[FileInfo.size])+full_name); 

résultats dans cette sortie

0000000021239384 C:\DATA\DELPHI\sxf_archive10-13.zip 

Cette déclaration

writeln(logfile,format('%17.17d ',[FileInfo.size])+full_name); 

résultats dans cette sortie

  21239384 C:\DATA\DELPHI\sxf_archive10-13.zip 

Le remplissage avec des zéros en tête change en espaces de début lorsque le spécificateur de précision est supérieur à 16. L'aide indique "Si la chaîne de format contient un spécificateur de précision, elle indique que la chaîne résultante doit contenir au moins le nombre de chiffres spécifié; si la valeur a moins de chiffres, la chaîne résultante est à gauche rembourré avec des zéros. »

Y at-il une autre façon de formater un entier de 20 caractères avec zéros?

Répondre

5

Précision d'une valeur Integer est limitée à 16 chiffres . max. Si la précision spécifiée est supérieur à 16, 0 est utilisé au lieu ce n'est pas un bug, il est logique codé en dur, et n'est pas documenté

il y a deux façons dont vous pouvez gérer cela.

  1. utiliser un Int64 au lieu d'un Integer. Précision pour un Int64 est de 32 chiffres max:

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

    Remarque: Delphi 2006 et plus tard, TSearchRec.Size est un Int64. Dans les versions antérieures, il s'agit d'un Integer à la place, et donc limité à 2 Go. Si vous avez besoin pour gérer la taille des fichiers> 2 Go dans les versions antérieures, vous pouvez obtenir la pleine taille 64 bits du champ 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. convertir le Integer à une chaîne sans zéros, puis utilisez StringOfChar() préfixer les zéros requis:

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

Merci! C'est la bonne façon de le faire - si je n'avais pas fait le bit de taille 64, il aurait finalement échoué sur un fichier de> 2 Go. Lorsque j'ai ajouté l'unité "windows" à la liste des utilisations pour le type ULARGE_INTEGER, cela a causé une erreur ailleurs sur "Findclose". J'ai dû rechercher que l'unité Windows définit une procédure findclose différente, donc j'ai dû changer mon utilisation à Sysutils.findclose. – tim11g