Vérifier le format d'un ShortString [Résolu]

Signaler
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
zwyx
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
Bonjour à tous,

Je souhaite récupérer depuis un fichier *.ini le format qui va être appliqué pour afficher les flottants, grâce à la fonction FormatFloat:
function FormatFloat(const Format: string; Value: Extended): string;

Lors de la lecture de ce paramètre, par la fonction ReadString:
function ReadString(const Section, Ident, Default: String): String; override;

je voudrais vérifier que cette chaîne est bien conforme pour être passée en argument de la fonction FormatFloat. J'ai commencé à écrire une procédure affreuse avec des if sur tous les caractères de la chaîne, mais c'est illisible. N'y aurait-il pas une méthode plus élégante et surtout plus efficace pour vérifier le format de cette chaîne ?

Bon week-end;

7 réponses

Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
var
  S,
  Section,
  Valeur : string;
  i      : integer;
  Flt    : Extended;
begin
  S := Ini.ReadString(Section, Valeur);

  i := Pos(',', S);
  if i = 0 then
    i := Post('.', S);

  if i <> 0 then
    S[i] := DecimalSeparator;

  if not TryStrToFloat(S, Flt) then
    MessageDlg('Erreur convertion flottant de la valeur ['+Section+']:'+Valeur,mtWarning, [mbOk], 0);
end;







<hr size="2" width="100%" />


http://deefaze.gnomz.com
Messages postés
4200
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
Lit une valeur flottante dans un fichier INI.

Syntaxe Delphi :

functionReadFloat (constSection,Ident:String;Default:Double):Double;override;

Syntaxe C++:

virtual double __ fastcallReadFloat(constAnsiStringSection,constAnsiString Name,doubleDefault);

Description

Appelez ReadFloat pour lire une valeur flottante dans un fichier INI.Section identifie la section qui contient la clévoulue.Ident spécifie le nom de la clécontenant la valeur flottante àlire.Default est la valeur flottante àrenvoyer si :

la section n'existe pas ;
    la clén'existe pas ;
    la valeur de données n'a pas été affectée pour la clé.

en gros :

Flt := Ini.ReadFloat('MaSection', 'MonFlottant', ValeurParDefaut);
if Flt = ValeurParDefaut then
  { gestion du probleme probleme ... }
else
  S := FormatFloat('%.0n', Flt);

<hr size="2" width="100%" />
http://deefaze.gnomz.com
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

C'est une idée. Mais je voudrais couvrir le cas où le format spécifié est du genre:
 #,##0.00;(#,##0.00)
Même si, là, j'avoue qu'il faudrait être maso pour marquer cette valeur dans le fichier *.ini.

Par hasard, n'y aurait-il pas moyen de faire un teste en utilisant les expressions régulières ?

Merci quand même f0xi.
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,

Regarde peut-être MatchesMask dans l'aide.
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Je viens de rentrer chez moi, donc je n'ai plus Delphi à disposition. Mais je regarderai ça lundi, dès la première heure.
Merci bien.
Messages postés
4716
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
@foxi :
pour info, je ne vois plus l'image deefaze.gif..

cantador
Messages postés
152
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Effectivement f0xi, j'ai finalement pensé à cette solution qui semble la meilleure, à savoir, essayer une conversion, au lieu de vérifier la validité du format. Si la conversion n'a pas déclenché d'exception, c'est que le format est correct. Ca paraît tellement évident une fois qu'on a la solution.

En plus, je vais directement recopier tes quelques lignes qui règlent le problème du séparateur décimal (point ou virgule).

Merci beaucoup !