Parser numérique en delphi
Date de publication : 18/09/2004
Par
Pierre Castelain (Contributions)
Ecriture d'un parser numérique en Delphi afin de transformer une chaîne de caractères en
valeur flottante ou entière.
1. Description
2. Téléchargement
1. Description
Il est assez courant d'avoir besoin d'analyser une chaîne de caractères
pour savoir si elle contient une valeur numérique. La plupart des développeurs
Delphi utilisent les fonction StrToFloat et StrToInt dans
un bloc try except pour réaliser cette opération. Le problème
avec cette méthode est que le code machine généré est relativement lourd
en raison du traitement des exceptions et que le déboguage de l'application
peut être fastidieux en raison des nombreuses exceptions levées. De plus,
ce genre de méthode ne permet pas de gérer facilement la présence de
suffixes dans la chaîne (des unités de mesure par exemple).
Je vous propose donc le code source d'un petit parser à états qui est
capable de tenir compte de ces difficultés. Il n'est pas question ici
d'expliquer la théorie de ce genre de code mais de vous fournir un
outil dont vous pourrez vous servir tous les jours. Sachez simplement
qu'un parser à état de ce type analyse la chaîne caractère par caractère
et passe d'un état à l'autre en fonction de ce qu'il a lu précédemment.
Par exemple, si le parser lit le premier caractère et détecte qu'il s'agit
d'un chiffre, il passera dans l'état 'Chiffre' et saura que pour que
la chaîne soit considérée comme un nombre le prochain caractère ne
peut être qu'un autre chiffre, un séparateur décimal, le caractère 'e'
(pour les puissances de 10 en notation scientifique) ou un espace.
Le parser continuera son analyse jusqu'à arriver à un état terminal,
la plupart du temps la fin de la chaîne.
L'unité Delphi que vous pouvez télécharger vous propose essentiellement
deux fonctions :
- DecodeStringValue : cette fonction analyse une chaîne et
retourne le type détecté : texte, entier ou flottant. La valeur numérique
est retournée également dans les deux derniers cas.
- DecodeStringValueWithSuffix : cette fonction fait la même
chose que la première mais est capable en plus de détecter un suffixe
parmi l'ensemble des suffixes autorisés passés en argument.
Voici un exemple d'appel de chacune de ces fonctions. Pour le reproduire,
créez un nouveau projet, ajoutez-y l'unité NumericalParser et posez
sur la fenêtre principale 2 TEdit et 2 TLabel. Faites en sorte
que le composant Label1 soit à coté du composant Edit1 et faites
de même pour les composants Label2 et Edit2.
Ajoutez ensuite un événement OnChange pour chacun des TEdit et copiez-y
les codes sources suivants :
procedure TForm1.Edit1Change(Sender: TObject);
var
value: double;
begin
case DecodeStringValue(Edit1.Text, value) of
svtText: Label1.Caption:= 'Texte : ' + Edit1.Text;
svtInteger : Label1.Caption:= 'Entier : ' + IntToStr(Trunc(value));
svtFloat : Label1.Caption:= 'Flottant : ' + FloatToStr(value);
else
Label1.Caption:= '?';
end;
end;
procedure TForm1.Edit2Change(Sender: TObject);
var
value: double;
suffixes: TStringList;
suffix: string;
begin
suffixes:= TStringList.Create;
suffixes.Add('mm');
suffixes.Add('cm');
suffixes.Add('m');
case DecodeStringValueWithSuffix(Edit2.Text, suffixes, true, value, suffix) of
svtText : Label2.Caption:= 'Texte : ' + Edit2.Text;
svtInteger : Label2.Caption:= 'Entier : ' + IntToStr(Trunc(value));
svtIntegerAndSuffix : Label2.Caption:= 'Entier avec suffixe: ' +
IntToStr(Trunc(value)) + ' ' + suffix;
svtFloat : Label2.Caption:= 'Flottant : ' + FloatToStr(value);
svtFloatAndSuffix : Label2.Caption:= 'Flottant avec suffixe : ' +
FloatToStr(value) + ' ' + suffix;
end;
suffixes.Free;
end;
Il ne vous reste plus qu'à tester le comportement du parser en
tapant ce qui vous passe par la tête dans les 2 TEdit. Vérifiez
que le décodage associé à Edit2 accepte les suffixes 'mm', 'cm' et 'm'.
2. Téléchargement
Le code source de l'unité NumericalParser est disponible sous forme d'archive zip :
NumericalParser.zip
| Articles | |
Delphi 2005 : Découvrez le futur Delphi 2005
| |
DirectX : Introduction à DirectX 9 en Delphi
| |
Variables d'environnement : Présentation, description et utilisation des variables d'environnement sous Windows
| |
Mailslots : Présentation des mailslots et de leur utilisation en Delphi pour la communication inter-processus
| | Projets complets avec sources | |
NumericalParser : Parser numérique en Delphi afin de transformer une chaîne de caractères en
valeur flottante ou entière.
| |
RegSearch : Composant de recherche dans la base de registre
| |
CDAReader : Lecture des informations contenues dans les fichier CDA de Windows
| |
ScreenSaverPreview : Composant d'affichage de l'aperçu des économiseurs d'écran de Windows
| |
ScanResources : Programme d'exploration des ressources des programmes ou des dll d'un répertoire
| |
ClipboardViewer : Démonstration de la détection des modifications et de l'affichage du contenu du presse-papier
| |
Matrix : Tentative de reproduction en Delphi de l'animation bien connue du film Matrix
| | Sources et exemples | |
EMFTransform : Transformation (rotation, inversion, miroir) d'un metafile Windows en mémoire
| |
DeleteKeyTree : Suppression récursive d'un clé de la base de registre
| |
MultiStrings : Routines de gestion de tableaux de chaînes C
| |
GetDllFilename : Pour récupérer le chemin d'une dll par son handle
| |
Extension du shell : Exemple d'extension du menu contextuel du shell de Windows
| |
TriStringGrid : Exemple de tri par colonne d'un composant TStringGrid à l'aide d'un algorithme
de tri rapide (quick sort)
| |
XPManifestCPL : Utilisation des contrôles XP dans une application du panneau de configuration (cpl)
| |
Bouboules : Modélisation à l'aide du design pattern Observer
| | Divers | |
Diagramme ternaire : Un logiciel gratuit de tracé de diagramme ternaire
|
|
|