Delphi La Fonction Format
Delphi La Fonction Format
Delphi La Fonction Format
Mises à jours du :
09/10/09
Corrections :
15/01/06, 30/11/05
Première version :
29/11/05
Licence : Pas d'Utilisation Commerciale, Partage des Conditions Initiales à l'Identique, v2.0 France
B) Performances
I) Conclusion
A) Quand utiliser Format ?
Utilisez format dés que vous désirez convertir une valeur en une chaine de caractères. En effet,
Format vas vous faciliter grandement la vie dans ce domaine, en remplaçant toutes les autres
fonctions comme FloatToStr ou IntToStr...
Comme vous l'avez compris, Format est LA fonction spécialisée dans le formatage de chaines, rendant
ainsi l'écriture et la lecture du code plus simple.
A.Bis) Recommandations.
- Les chaines de formatage ne sont pas compilées dans Delphi, contrairement en C et C++. Vérifiez
donc bien le type des spécificateurs de format que vous utiliserez pour éviter les erreurs d'exécution.
- Pour les concaténations de chaines courtes (string et char), il est préférable de ne pas utiliser format,
mais plutôt la bonne vieille méthode qui est la plus rapide, par exemple :
SC := protocol+'://'+domainename+'/';
{ au lieu de : SC := format('%s://%s/',[protocol,domainename]); }
B) Performances
Je vous le donne en mille, Format est plus rapide que la plupart des méthodes de base que tout le
monde utilise! (note de l'auteur : parfois oui, parfois non! Mesurez!)
- 1er test :
Résultat :
Moyenne de 945 ms (sur Athlon XP 1800+) presque 1 seconde.
- 2eme test :
Résultat :
Moyenne de 532 ms (sur Athlon XP 1800+) presque 1/2 seconde.
const Format correspond à la chaine de format, elle contient le texte et les spécificateurs de format de
cette dernière.
const Args correspond au tableau d'arguments à appliquer aux spécificateurs de format contenus dans
la chaine de formatage.
const FormatSettings (facultatif) permet de définir des variables de format temporaire qui n'affectent
pas les variables globales du programme (decimalSeparator par exemple) .
Format fait appel à FmtStr(); incluse elle aussi dans l'unité SysUtils.
Une chaine de formatage est tout simplement une chaine qui contient d'une part du texte et d'autre part
des spécificateurs de format.
Un spécificateur de format est un "marqueur" qui permet d'identifier le type et les paramètres de
traitement d'un argument à formater dans une chaine de format.
Dans Delphi comme dans C++, un spécificateur de format commence toujours par le symbole "%".
Il est donc logique que le caractères % (pour afficher un pourcentage par exemple) s'obtienne donc en
le doublant comme ceci "%%" à l'instar d'un double ' ' dans une chaine string, exemple :
"%"[index ":"]["-"][largeur]["."précision]type
Comme dit précédemment, Le spécificateur de format commence toujours par le symbole %, il sera
suivis ensuite de divers paramètres (dans l'ordre) :
TYPE DEFINITION
%d Entiers
Types admits :
integer, smallint, shortint, longint, int64, byte, word, uint64, cardinal, longword...
Si le spécificateur de précision est défini, la chaine en sortie sera remplie de zéro (leadZero) si la
taille de l'entier est inférieure à celle de la précision.
exemple :
Types admits :
integer, smallint, shortint, longint, int64, byte, word, uint64, cardinal, longword...
%u serai équivalent à :
format('%d', [abs(var)]);
Types admits :
single, real, real48, double, comp, extended, currency.
La valeur est convertie en une chaîne de la forme "-d.ddd...E+ddd". Le nombre total de chiffres
dans la chaîne résultante (y compris celui qui précède la virgule) est donné par le spécificateur
de précision dans la chaîne de format. Si celui-ci est omis, une précision de 15 est prise en
compte par défaut.
Le caractère "E" dans la chaîne résultante est toujours suivi d'un signe "+" ou "-", puis de trois
chiffres au moins.
%f Réels
Types admits :
single, real, real48, double, comp, extended, currency.
exemple :
Types admits :
single, real, real48, double, comp, extended, currency.
La valeur est convertie en une chaîne décimale la plus courte possible en utilisant le format
fixe ou scientifique.
Le nombre de chiffres significatifs dans la chaîne résultante est fourni par le spécificateur de
précision dans la chaîne de format, une précision par défaut de 15 est prise en compte si le
spécificateur de précision est omis.
Les caractères zéro sont supprimés de la fin de la chaîne résultante et la virgule décimale
n'apparaît que si elle est nécessaire.
La chaîne résultante utilise le format fixe si le nombre de chiffres à gauche de la virgule est
inférieur ou égal à la précision indiquée et si la valeur est supérieure ou égale à 0,00001. Sinon,
la chaîne résultante fait appel au format scientifique.
Types admits :
single, real, real48, double, comp, extended, currency.
L'argument doit être une valeur flottante. La valeur est convertie en une chaîne de la forme
"-d,ddd,ddd.ddd...".Le format "n" correspond au format "f", sauf que la chaîne résultante contient
des séparateurs des milliers.
exemple :
format('%n', [1024584248.125]);
renvois "1 024 584 248,125"
NOTE : (%n suite)
Types :
integer, smallint, shortint, longint, byte, word, int64, cardinal.
exemple :
Types admits :
single, real, real48, double, comp, extended, currency.
exemple :
CurrencyString := '€';
format('15 Francs en Euros = %.5m', [15 * 0,152449]);
renvois "15 Francs en Euros = 2,286735 €"
CurrencyString := 'Fr';
format('15 Euros en Francs = %.2m', [15 * 6.55957]);
renvois "15 Euros en Francs = 98,39355 Fr"
%p Adresses de pointeur
Types supportés :
(^Type), pAnsiString, pString, pByteArray, pCurrency, pDouble, pExtended, pSingle,
pInteger, pOleVariant, pShortString, pTextBuf, pVarRec, pVariant, pWideString,
pWordArray, pointer(...)...
La valeur est convertie en une chaîne de 8 caractères (32bits) hexadécimaux, chaine qui
représente l'adresse du pointeur.
exemple :
format('%p', [PInteger(1024)]);
renvois "00000400"
Types admits :
String, Char, PChar, AnsiString, WideString, ShortString, AnsiChar, WideChar...
exemple :
%x Hexadécimal
Types admits :
ordinaux, scalaires, entiers, integer, smallint, shortint, longint, byte, word, int64, cardinal,
longword, uint64...
exemple :
"Quel que soit le format flottant, les deux caractères utilisés comme séparateur décimal et
séparateur des milliers sont respectivement définis par les variables globales DecimalSeparator et
ThousandSeparator ou leur équivalent TFormatSettings."
Il faut comprendre par la, qu'en assignant une nouvelle valeur à ces variables globales, on peu modifier
l'aspect d'affichage mais également de réceptions des valeurs de type flottant.
Un exemple concret de cette méthode est par exemple la réception d'un chiffre à virgule dans une
boite d'édition (TEdit). L'utilisateur peut soit mettre un point « . » pour définir le séparateur décimal, soit
mettre une virgule « , » pour définir le séparateur des décimales.
Afin d'éviter le declenchement d'une exception de conversion, il nous faut écrire une méthode simple
pour savoir si nous sommes en présence d'un point ou d'une virgule comme séparateur de décimales.
Exemple :
procededure TformX.EditXKeyPress(Sender: Tobject; var Key: char);
begin
if key in ['.',','] then
DecimalSeparator := Key;
end;
Cette méthode influera directement sur toutes les fonctions de conversion Flottant vers Chaine et
inversement, tel Format, FloatToStr, FloatToStrDef, StrToFloat etc....
Après traitement, nous pourrons réassigner à DecimalSeparator, une valeur par défaut (virgule par
exemple) et afficher les résultats en conséquence.
DecimalSeparator := ',';
Format('mon resultat est : %.2n',[resultat]);
Attention, la manipulation, modification des variables globales de formatage doit être faite avec
prudence et réflexion, sans abus aucuns.
Exemple :
format('%.*f',[precision, chiffre]);
(PS : ne rigolez pas, j'ai déjà vus ce genre de code dans des programmes pourtant sérieux. Ce qui
démontre bien le manque de connaissance vis à vis de la fonction Format).
On peu bien sur, utiliser "*" pour l'indice ou pour la taille exemple (sur l'indice) :
Type
TColor3h = record
Red, Green, Blue : byte;
end;
Dans cette fonction, grâce à "*" encore une fois, on raccourcit radicalement le code, ce qui évite de
faire des cascade de IF ... ELSE ou de CASE ... OF. La méthode devient alors simple et rapide, tout
cela grâce à Format.
I) Conclusion
- Format est la solution la plus pratique pour convertir une valeur en une chaine de
caractères, même la plus courte qu'il soit.
- Format peut fonctionner comme les fonctions très connues que sont LeadZero et LeadSpace!