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 :

[D7] Formatage d'une chaine de caractère


Sujet :

Delphi

  1. #1
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut [D7] Formatage d'une chaine de caractère
    Bonjour,

    je voudrais transformer une chaine comme '12345,67' en '12 345,67' (ajout d'un séparateur des milliers). J'ai ceci :

    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
    28
    29
    30
    { =========================================================== }
    function FormatString(const NumberStr: string): string;
    var
      i, j, DecimalPos: Integer;
      IntegerPart, DecimalPart, ResultStr: string;
    begin
      DecimalPos := Pos(',', NumberStr);
      if DecimalPos > 0 then
      begin
        IntegerPart := Copy(NumberStr, 1, DecimalPos - 1);
        DecimalPart := Copy(NumberStr, DecimalPos, Length(NumberStr) - DecimalPos + 1);
      end
      else
      begin
        IntegerPart := NumberStr;
        DecimalPart := '';
      end;
      // ajout des espaces tous les trois chiffres
      ResultStr := '';
      j := 0;
      for i := Length(IntegerPart) downto 1 do
      begin
        Inc(j);
        ResultStr := IntegerPart[i] + ResultStr;
        if (j mod 3 = 0) and (i > 1) then
          ResultStr := ' ' + ResultStr;
      end;
      Result := ResultStr + DecimalPart;
    end;
    { =========================================================== }
    Est ce qu'il n'y a pas plus simple ou plus rapide ?

    A+
    Charly

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 855
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 855
    Points : 13 659
    Points
    13 659
    Par défaut
    Plus simple sans aucun doute.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := FormatFloat('0,.##', StrToFloat(NumberStr));

  3. #3
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut
    Ah Ah, merci Andornot, je savais bien qu'il y avait un truc !

    A+
    Charly

  4. #4
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut
    PS : dans ta solution, il faut être sûr que le séparateur décimal est bien la virgule

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 855
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 855
    Points : 13 659
    Points
    13 659
    Par défaut
    Ce sera le séparateur défini au niveau système. Il faut jouer avec TFormatSettings sinon.

    Ici la source est à virgule et le résultat en fonction du FormatSettings par défaut, initialisé avec les réglages OS (paramètres régionaux).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      FS :TFormatSettings;
    begin
      FS.DecimalSeparator := ',';
      Result := FormatFloat('0,.##', StrToFloat(NumberStr, FS));
    end;

  6. #6
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut
    Merci Andnotor,
    j'aurai voulu 2 chiffres près la virgule, même si la chaine de départ n'en comporte pas. J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := FormatFloat('0,.##', StrToFloat(Format('%8.2f', [StrToFloat(NumberStr)])));
    Mais ça n'a pas l'air de marcher ?

    As tu une solution ?

    Merci
    A+
    Charly

  7. #7
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut
    J'ai trouvé. C'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := FormatFloat('###,##0.00', StrToFloat(NumberStr));
    Pas facile ces masques de FormatFloat !

    Cette fois c'est résolu !

    A+
    Charly

  8. #8
    Membre habitué
    Homme Profil pro
    libre
    Inscrit en
    Septembre 2024
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Septembre 2024
    Messages : 92
    Points : 164
    Points
    164
    Par défaut
    Il y a le format numérique n qui ajoute le séparateur millier
    Format('%n',[12345.67])

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 798
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 798
    Points : 25 803
    Points
    25 803
    Par défaut
    Format et FormatFloat utilise des masques totalement différents
    System.SysUtils.Format
    System.SysUtils.FormatFloat
    La documentation récente doit être valable pour D7, ces fonctions historiques ont peu évolué.

    D'ailleurs on trouve sur le forum ce sujet : Fonction FORMAT avec le separateur de milliers


    Citation Envoyé par n
    %n
    Nombre. L'argument doit être une valeur à virgule flottante. La valeur est convertie en une chaîne de la forme "-d,ddd,ddd.ddd...". Le format "n" correspond au format f, sauf que la chaîne résultante contient le séparateur des milliers
    .

    Citation Envoyé par f
    %f
    Fixe. L'argument doit être une valeur à virgule flottante. La valeur est convertie en une chaîne de la forme "-ddd.ddd...". La chaîne résultante débute par un signe moins si le nombre est négatif. Le nombre de chiffres après le séparateur décimal est fourni par le spécificateur de précision de la chaîne de format ; 2 décimales sont prises en compte par défaut si le spécificateur de précision est omis.
    enfin, il y aussi le format monétaire souvent un nombre flottant du type 12 345,67 c'est pour afficher de la compta avec de nos contrées € comme évoqué par Charly910 dans le sujet Séparateur de milliers avec 2 décimales

    Citation Envoyé par m
    %m
    Monétaire. L'argument doit être une valeur à virgule flottante. La valeur est convertie en une chaîne représentant une valeur monétaire. La conversion est contrôlée par les variables globales CurrencyString, CurrencyFormat, NegCurrFormat, ThousandSeparator, DecimalSeparator, et CurrencyDecimals ou leur équivalent dans une structure de données TFormatSettings. Si la chaîne de format contient un spécificateur de précision, il redéfinit la valeur donnée par la variable globale CurrencyDecimals ou son équivalent TFormatSettings.
    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

  10. #10
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut
    Merci pour toutes ces précisions
    A+
    Charly

  11. #11
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 855
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 855
    Points : 13 659
    Points
    13 659
    Par défaut
    Citation Envoyé par Charly910 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := FormatFloat('###,##0.00', StrToFloat(NumberStr));
    Tous ces # sont inutiles et la position de la virgule n'a aucune importance, sa seule présence suffit à indiquer que tu veux cette séparation. Tu la mettrais à la fin 0.00, que tu aurais le même résultat.

  12. #12
    Membre expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 432
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 432
    Points : 3 201
    Points
    3 201
    Par défaut
    Ok, merci Andnotor

    A+
    Charly

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

Discussions similaires

  1. [RegEx] Formatage d'une chaine de caractère.
    Par Niki59 dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2012, 14h29
  2. Formatage d'une chaîne
    Par johntayback dans le forum Débuter
    Réponses: 27
    Dernier message: 25/06/2009, 11h01
  3. formatage d'une chaine de caractère
    Par Kropernic dans le forum Windows Forms
    Réponses: 6
    Dernier message: 18/10/2007, 16h53
  4. formatage d'une chaine
    Par kirua2150 dans le forum Delphi
    Réponses: 4
    Dernier message: 04/07/2006, 20h11
  5. Formatage d'une chaine pour sscanf
    Par Pragmateek dans le forum C
    Réponses: 6
    Dernier message: 30/04/2006, 01h11

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