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

Lazarus Pascal Discussion :

Fonction Format avec des QWord


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut Fonction Format avec des QWord
    Bonjour,

    Apparemment, la fonction Format en Lazarus ne traduit pas les Types QWord. Est-ce que quelqu'un a déjà résolu ce problème?
    Sinon, j'utiliserais IntstoStr qui accepte les QWord...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       StTValTerme.Caption := Format('F%D = %N',[NTerme,ValTerme]);
    %D fonctionne car NTerme est un LongInt, mais ne donne pas de séparation des milliers
    %N produit une erreur => message d'erreur...

    Nom : message_2.jpg
Affichages : 353
Taille : 22,5 Ko

    J'aurai voulu une séparation des milliers dans le QWord, mais l'option %N de Format plante

    Merci

  2. #2
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Bonjour,

    tiens, expérimente à partir de là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      qw: QWord;
    begin
      qw := 123456789;
      DefaultFormatSettings.ThousandSeparator := ' ';
      Caption := format('chiffres : %12.0n', [double(qw)]);
    Nom : capture.png
Affichages : 532
Taille : 3,7 Ko

  3. #3
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Merci Jipété, ça marche en partie!

    Citation Envoyé par Jipété Voir le message
    ,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      qw: QWord;
    begin
      qw := 123456789;
      DefaultFormatSettings.ThousandSeparator := ' ';
      Caption := format('chiffres : %12.0n', [double(qw)]);
    Nom : capture.png
Affichages : 532
Taille : 3,7 Ko
    L'idée d'utiliser le Double qui est accepté est Super!
    mais, il arrondi probablement à la dernière décimale du Double.
    En effet, si je prends QWord = 18 446 744 073 709 551 615, sa valeur max, j'obtiens: 18 446 744 073 709 552 000

    A Voir

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 142
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 142
    Par défaut
    Yep !

    Citation Envoyé par Jlmat Voir le message
    En effet, si je prends QWord = 18 446 744 073 709 551 615, sa valeur max, j'obtiens: 18 446 744 073 709 552 000
    En effet, si je prends QWord = 18 446 744 073 709 551 615, sa valeur max, j'obtiens les mêmes 16 premiers chiffres que toi puis à la fin les 4 derniers ici c'est ...1616 alors que toi tu annonces ...2000 !
    Je te suspecte d'être sous Windows, non ? Ou une vieille version de Lazarus / FreePascal ? Moi j'ai la dernière, 2.2.4/3.2.2.

    Mais pour arriver à ce calcul, je me suis d'abord fait insulter, quand j'ai balancé les 20 chiffres sans espaces, comme quoi je dépassais la capacité du QWord !

    J'ai fouillé dans l'aide et j'y ai trouvé que le QWord était un objet sur 64 bits comme le int64 mais unsigned !
    Ce qui n'est pas ce que le compilateur m'a dit, ne voulant pas dépasser le max de l'int64, 92233...

    Donc j'ai bidouillé un truc de ouf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      qw: QWord;
      uqw: uint64;// unsigned(QWord) ça ne passe pas
    begin
      uqw := 18446744073709551615;
      DefaultFormatSettings.ThousandSeparator := ' ';
      Caption := format('chiffres : %20.0n', [double(uqw)]);
    F9 et ça m'a donné le nombre que j'ai cité + haut.
    Nom : max_qword.png
Affichages : 301
Taille : 4,0 Ko

    En mettant %24.0n ça me donne les mêmes 20 chiffres cités, donc il ne va pas plus loin que 20 chiffres et je trouve que ton résultat est beaucoup arrondi.
    S'ils décident de partir sur Mars en faisant des calculs comme ça, c'est sûr qu'on va les perdre dans l'espace intersidéral,

    Je suis sous Linux Debian (la dernière) en 64 bits.

  5. #5
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Merci Jipété

    En effet, si je prends QWord = 18 446 744 073 709 551 615, sa valeur max, j'obtiens les mêmes 16 premiers chiffres que toi puis à la fin les 4 derniers ici c'est ...1616 alors que toi tu annonces ...2000 !
    Je te suspecte d'être sous Windows, non ? Ou une vieille version de Lazarus / FreePascal ? Moi j'ai la dernière, 2.2.4/3.2.2.
    Très intéressant. oui en effet, je suis sur Windows 10. Ma version de Lazarus est 2.2.2, ça évolue vite! Je la mettrai à jour.

    J'essaierais alors ton code... et te tiens au courant

    A+

  6. #6
    Membre éclairé
    Avatar de Jlmat
    Homme Profil pro
    Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Inscrit en
    Avril 2008
    Messages
    370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ex Informaticien et Consultant en Ressources Humaines, Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 370
    Par défaut
    Yop!

    J'ai fait une mise à jour de Lazarus 2.2.4/FPC 3.2.2 sous windows 10 en 64 bits.

    J'ai utilisé une variable de type uint64, mais j'ai toujours le même arrondi à la fin : j'obtiens: 18 446 744 073 709 552 000

    J'ai fait une mise à jour en gardant mes paramètres et non pas une 2ème installation différente...

    Je vais donc continuer d'utiliser des intTostr pour l'instant!
    J'ai écrit une petite fonction pour ça:

    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
     
    function fSepareMilliers(S: string): String;
      var I: integer;
    begin
      Result := S;
      I := Length(S)-2;
      while I > 1 do
      begin
        Insert(' ', Result, I);
        I := I - 3;
      end;
    end;  
     
    // --------
     StTSommeTermes.Caption := 'SOMME = '+fSepareMilliers(Inttostr(SomTermes),' ');


Discussions similaires

  1. [RegEx] Utilisation de la fonction "preg_match_all" avec des apostrophe ou des œ
    Par arnaudperfect dans le forum Langage
    Réponses: 4
    Dernier message: 16/08/2008, 23h05
  2. Réponses: 8
    Dernier message: 07/04/2008, 12h02
  3. Fonction puissance, avec des decimales
    Par n0o38 dans le forum Langage
    Réponses: 4
    Dernier message: 01/07/2007, 00h40
  4. exporter dans un format avec des insert into
    Par kurkLord dans le forum Oracle
    Réponses: 2
    Dernier message: 12/06/2006, 11h43
  5. Réponses: 5
    Dernier message: 28/04/2006, 14h40

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