Developpez.com

Club des développeurs et IT pro
Plus de 4 millions de visiteurs uniques par mois

Developpez.com - Delphi
X

Choisissez d'abord la catégorieensuite la rubrique :


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 // Démonstration de l'appel de DecodeStringValue 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 // Démonstration de l'appel de DecodeStringValueWithSuffix 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


Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Pierre castelain. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Responsables bénévoles de la rubrique Delphi : Gilles Vasseur - Alcatîz -