IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

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