Parser numérique en delphiDate 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 :
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 :
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
|