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 :

Comment utiliser un nombre à virgule ?


Sujet :

Delphi

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut Comment utiliser un nombre à virgule ?
    bonjour

    je suis entrain de programmer un logiciel de type caisse / calculatrice

    j'ai décidé d'utiliser des variable "double" pour les prix et le total, afin de gérer les centimes ...

    quand je saisie un prix dans le code, j'utilise un point (qui sert de virgule)

    pour afficher le total (avec un point en guise de virgule), j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    str(total:10:2, variable_string);
    mon_edit.text := variable_string;
    seulement il y a un espace + le total au lieu d'avoir uniquement le total

    j'ai donc opté pour un autre affichage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mon_edit.text := FloatToStr(variable_double);
    cette fois le prix s'affiche bien, il n'y a pas de point pour séparer les centimes, mais une virgule

    si je souhaite laisser l'utilisateur saisir le prix depuis un Tedit, celui ci doit saisir le prix avec une virgule et non un point

    ça devient confus ...

    je ne suis pas contre la virgule, mais sur des tickets de caisse, on ne voit que des points, donc j'aimerais faire ainsi

    quelle combinaison dois je utiliser pour avoir un affichage correcte ?

    merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Comme il ne me semble pas avoir vu de version de Delphi, j'indique ici quelque chose de D7 compatible.

    j'ai décidé d'utiliser des variable "double" pour les prix et le total, afin de gérer les centimes ...
    pour le prix d'accord (i.e. le litre d'essence) pour le total currency serait peut être mieux

    Une solution consiste à forcer tout le programme à utiliser le Point Décimal et non ce qui est configuré dans le système (et ce bien sûr sans changer la configuration )

    par exemple ainsi, directement dans le source du projet
    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
     
    program Project1;
     
    uses
      Forms, SysUtils,
      Unit1 in 'Unit1.pas' {Form1};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      DecimalSeparator:='.';
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Puisque l'on est sur des valeur monétaires, utiliser FloatToStr(variable_double); pour un Currency n'est pas une bonne idée
    en effet FloatToStr(24.1256) donnera 24.1256 au lieu de, à priori, 24.13
    pour la monnaie (currency) tout comme le point décimal on peut modifier le signe à utiliser via CurrencyString

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CurrencyString:=''; //pour ne pas en avoir
    CurrencyString:='EUR'; // etc....
    de même que la position de cette dernière via CurrencyFormat
    0 = Before amount
    1 = After amount
    2 = Before amount with space
    3 = After amount with space
    il vaut mieux écrire au choix !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // si variable_double= 24.1256
    MonEdit.Text:=Format('%3.2f',[variable_double]);                      24.13
    MonEdit.Text:=FloatToStrF(variable_double, ffCurrency, 10, 2)    24.13
    // currencyString:='EUR'
    // CurrencyFormat:=2; 
    MonEdit.Text:=format('%m',[variable_double]);                    EUR 24.13
    Monedit.Text:=CurrTostrF(Variable_Double,2);                     EUR 24.13

    si je souhaite laisser l'utilisateur saisir le prix depuis un Tedit
    mauvais choix que le TEdit, un TMaskEdit serait déjà un mieux ou un composant plus élaboré ne permettant que la saisie de nombre
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 447
    Points : 24 849
    Points
    24 849
    Par défaut
    Citation Envoyé par Coussati Voir le message
    j'utilise ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    str(total:10:2, variable_string);
    mon_edit.text := variable_string;
    seulement il y a un espace + le total au lieu d'avoir uniquement le total
    C'est normal, tu lui indiques de "padder" sur 10 digits !
    Ton Total doit être un nombre à 6 chiffres avant la virgule avec le point plus deux chiffres après la virgule, cela fait 9 caractères, plus l'espace au début, cela fait bien 10 !

    Teste 15 tu auras 6 espaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    str(total:15:2, variable_string);
    Teste 0 tu n'auras aucun espace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    str(total:0:2, variable_string);
    Sinon, c'est une VIEILLE syntaxe qu'il ne faut plus utiliser avec les Delphi Unicode !
    Le Format permet exactement la même chose comme la si bien montrer SergioMaster

    Mais j'ajouterais l'utilisation de TFormatSettings qui permet de forcer ponctuellement le séparateur de milliers, de choisir le point comme séparateur décimal au lieu de la virgule

    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
    var
      variable_string: string;
      Total: Double;
      FS: TFormatSettings;
    begin
      total := 123456.78901;
      str(total:15:2, variable_string);
      ShowMessage('str:15:2 : "' + variable_string + '"');
     
      ShowMessage('DecimalSeparator Locale : "' + Format('%.2f', [total]) + '"');
     
      FS := TFormatSettings.Create();
      FS.DecimalSeparator := '.';
      ShowMessage('DecimalSeparator . : "' + Format('%.2f', [total], FS) + '"');
    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
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 683
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 683
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Coussati Voir le message
    cette fois le prix s'affiche bien, il n'y a pas de point pour séparer les centimes, mais une virgule

    si je souhaite laisser l'utilisateur saisir le prix depuis un Tedit, celui ci doit saisir le prix avec une virgule et non un point

    ça devient confus ...
    Normalement pas.
    Le "." du numpad correspond au code VK_DECIMAL et est interprété en fonction des réglages. L'utilisateur tapera toujours sur la même touche.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Pour se débarrasser d'un espace, faire replacestr(Chaine,' ','');
    Pour s'assurer d'avoir un point (ou une virgule c'est selon) replacestr(Chaine,',',',');

  6. #6
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    merci à tous pour votre aide

    @SergioMaster tes exemples m'ont pas mal aidé


    @ShaiLeTroll je n'avais pas bien capté cette histoire de digit, maintenant je saisie mieux

    concernant ton code, sous delphi 7 il faut retirer "FS := TFormatSettings.Create();"


    @Andnotor je sais bien, mais tout les pc n'ont pas forcément le numpad à droite, et donc peut utiliser la touche point ou virgule

    après on peut mettre une petite protection pour transformé, mais je cherchais la meilleure formule


    @sgmsg j'avais déjà essayé ce genre de formule pour supprimer les espaces, mais ça ne fonctionnait pas

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Pour effacer des caractères

    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
    function EffaceCars(const Chaine:string; Caracteres:TSysCharSet=['+'..'.','0'..'9']):string;
    //ShaiLeTroll 20130505
    var Len, I, J : integer;
    begin
      Len := Length(Chaine);
      SetLength(Result, Len);
      J := 0;
      for I := 1 to Len do
      begin
        if not (Chaine[i] in Caracteres) then
        begin
          inc(J);
          Result[J] := Chaine[i];
        end;
      end;
      SetLength(Result, J);
    end;
    Pour remplacer des caractères

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function RemplaceCars(const Chaine:string; Caracteres:TSysCharSet=['+'..'.','0'..'9'];Par:Char=':'):string;
    //ShaiLeTroll 20130505
    var Len, I : integer;
    begin
        Len := Length(Chaine);
        Result:=chaine;
        for I := 1 to Len do if (Chaine[i] in Caracteres) then
           Result[i] := Par;
    end;
    A+

Discussions similaires

  1. Comment afficher un nombre à virgule ?
    Par DR0GV3 dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 10/07/2011, 19h50
  2. Comment séparer les nombres à virgule ex : 25,35
    Par kraken972 dans le forum Langage
    Réponses: 3
    Dernier message: 15/05/2008, 22h23
  3. Comment imposer un nombre de chiffre après la virgule
    Par Yagami_Raito dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 10h24
  4. Comment limiter le nombre apres la virgule?
    Par pierrot10 dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2006, 22h12
  5. [Console] Comment afficher de gros nombres à virgule ?
    Par Évariste Galois dans le forum C++
    Réponses: 9
    Dernier message: 11/07/2005, 09h49

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