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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Conversion String en Float (Flottant avec point)


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Par défaut Conversion String en Float (Flottant avec point)
    Bonjour,

    Je suis devant un problème, qui pourrait vous sembler facile à résoudre mais je
    ne suis qu'un débutant

    J'ai un souci de conversion, je m'explique : Je dois afficher une valeur dans un
    stringgrid en prenant en compte un paramètre de représentation (0,001 par exemple).

    Je reçois des données par le réseau CAN, que je récupère dans la
    variable "factor" de type double. Je dois multiplier par un coefficient
    défini de façon arbitraire de type float et je dois afficher la valeur avec
    la résolution demandée.

    La ligne valFin := SimpleRoundTo(StrToFloat(factor),-nbDec); me pose
    une erreur car elle contient un point et non une virgule.

    Pouvez-vous me dire comment convertir un string de decimal avec virgule
    en decimal avec point svp ? Merci

    Pour l'instant, j'utilise une routine qui parcourt la variable valFin en remplaçant
    la virgule par le point de façon "artificielle".



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    Begin
    	coeff := 1,56;
    	FormAffichage := 0,005;
     
    	// Détection de la position de la virgule : nbDec->Nb de chiffres après virgule
    	for cptPosVirg:=0 to length(FormAffichage) Do
    	Begin
    		if FormAffichage[cptPosVirg]=',' then posvirgl:=cptPosVirg;
    		nbDec := length(FormAffichage)-posvirgl;
    	End;
     
    	factor := FloatToStr(longint((@donnee[5])^)*coeff);  // On récupère l'info sur le CAN et on multiplie par le coeff
     
    	// Formatage de la valeur à afficher (on remplace la "," par le ".")
    	for ab:=0 to length(factor) Do
    	Begin
    		if factor[ab]=',' then factor[ab]:='.';
    	End;
     
    	valFin := SimpleRoundTo(StrToFloat(factor),-nbDec);   // On arrondit la valeur à afficher en respectant le format demandé
    End
    Else
    Begin
    	if(donnee[4]=0) then StringGrid1.Cells[3,n]:=FloatToStr(valFinale)+' '+PParameterReceived^.Unite;
    End;

  2. #2
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Regarde du côté de TFormatSettings et DecimalSeparator, à utiliser avec StrToFloat, di genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      lFormatSettings:TFormatSettings;
      lValeur1:Double;
    begin
      lFormatSettings.DecimalSeparator := '.';
      lValeur1 := StrToFloat(MaString,lFormatSettings);

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 083
    Par défaut
    FormatFloat avec le paramètre de type TFormatSettings permet de configurer librement le séparateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var
      FormatSettings: TFormatSettings;
    begin
      // Le séparateur décimal est le point "." et non pas la virgule.
      GetLocaleFormatSettings(0, FormatSettings);
      FormatSettings.DecimalSeparator := '.';
      Result := StrToFloat(Value, FormatSettings);
      ...
    end;
    Si tu un vieux Delphi je crois que cette variante de StrToFloat n'apparait qu'en D7 ou D2005, tu avais déjà quelques fonctions qui le supportait mais pénible d'utilisation

    Tu peux donc modifier avec ReplaceChar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    function CheckDecimalSeparator(const S: string): string;
    begin
      Result := S;
      ReplaceChar(Result, ',', DecimalSeparator);
      ReplaceChar(Result, '.', DecimalSeparator);
    end;
     
    {* -----------------------------------------------------------------------------
    la procédure ReplaceChar remplace dans S le caractère OldChar par le caractère NewChar
    @param S chaine à modifier
    @param OldChar caractère à remplacer
    @parem NewChar caractère de substitution
    ------------------------------------------------------------------------------ }
    procedure ReplaceChar(var S: string; const OldChar, NewChar: Char);
    var
      i: Integer;
      p: PChar;
    begin
       if OldChar = NewChar then Exit;
     
       p := @S[1];
       for i := 0 to Length(S)-1 do
       begin
          if PChar(p+i)^ = OldChar then
             PChar(p+i)^ := NewChar;
       end;
    end
    ;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2009
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2009
    Messages : 56
    Par défaut
    Bonjour,

    Merci beaucoup pour vos réponses.
    Vous me tirez une épingle du pied.
    ShaiLeTroll > J'utilise Delphi7 donc normalement pas de souci

    Problème résolu grâce à vous. Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/01/2010, 11h28
  2. Conversion string to Float (deux numero après la virgule)
    Par abbd dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/02/2009, 01h02
  3. tentative conversion string vers float
    Par firemax dans le forum C
    Réponses: 10
    Dernier message: 21/08/2007, 17h42
  4. Conversion string en float
    Par jyerfr dans le forum C#
    Réponses: 5
    Dernier message: 13/06/2007, 09h06
  5. Problème de conversion String en Float avec JTable
    Par dumasan dans le forum Composants
    Réponses: 4
    Dernier message: 23/04/2007, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo