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

Contribuez Delphi Discussion :

Des Currency dans du texte


Sujet :

Contribuez Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Des Currency dans du texte
    Salut,

    Je n'ai pas retrouvé de fonction sous delphi permettant de tranformer un String en Currency. (enfin je parle pas de StrToCurr() ou autre...) mais une fonction qui garantie quelque soit la valeur signe décimal du système . ou ,

    C'est vrai on pourrait changer cet attribut système, mais le texte peut toujours être différent.
    Récemment dans un projet j'avais un fichier texte avec des lignes à reprendre pour alimenter une base, le taux de TVA écrit ainsi 19.6 et quelques lignes plus loin 19,6 et je vous raconte pas les chiffres, et je vous garantie que StrToCurr() ou autre fonction ne change pas le problème.


    Tout le monde à ça petite procédure je n'en doute pas, je propose la mienne :
    Unit Math nécessaire

    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
      Function StrToCurrSys(chaine:String): Currency;
      Var
        Diviseur: Extended; // Forcement multiple de 10
      begin
        Result   :=0;
        Diviseur :=1;
        if Pos('.',chaine) <> 0 then Diviseur := Power(10,(Length(Chaine) - Pos('.',Chaine)))
        else if Pos(',',chaine) <> 0 then Diviseur := Power(10,(Length(Chaine) - Pos(',',Chaine)));
     
        // on tranforme chaine en entier enfin on pourrai dire...
        Chaine := StringReplace(Chaine,' ','',[rfReplaceAll]); // on retire d'éventuels espaces
        Chaine := StringReplace(Chaine,'.','',[]); // on retire l'éventuel point
        Chaine := StringReplace(Chaine,',','',[]); // on retire l'éventuel virgule
     
        // on retourne la valeur avec le signe décimal du poste sans changer les paramètres systèmes
        Result := StrToInt64(Chaine) / Diviseur;
     
      end;
    Je n'ai pas prévu de tester si la chaine comporterait 2 fois des . ou , ou même si un caractère serait présent, puisque je fais attention à ce que j'envoi.

    Si une fonction delphi similaire existe n'hésite pas à me le dire...

    Bye.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    En effet certaines valeurs comme les suivantes seront mal gérées :
    1.000.000,00
    1,000,000.00

    1° remarque : prévoir la fonction StrToCurrSysDef qui renvoie une valeur par défaut.
    2° remarque : passer par des règles de "parser" pour traiter ces valeurs... et savoir qu'est ce que l'on considère comme consistant dans les chaines lues.
    Après, pour des cas où les valeurs possibles sont limitées, cela peut être utile.
    3° remarque : faire les contrôles plus en amont et plus étroitement, lors de la saisie (si c'est possible)...
    Philippe.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    La remarque 3 est impossible, il n'y a pas saisie de l'utilisateur dans mon cas, c'est le traitement de lignes d'un fichier texte.

    Le parser, effectivement ce serait plus professionnel.
    StrtoCurrSysDef, en fait lorsque je l'ai fait j'y ai pensé.

    Merci à toi.

    Si j'ai le temps je ferai tes 2 remarques et je traiterai les cas de séparateur de milliers

    PS : je suis aussi tombé sur celui-ci aujourd'hui ICI
    l'inconvénient c'est qu'il peut retourner du texte et ne gère pas non plus tes 2 exemples (enfin si, en retournant du texte).

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    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 021
    Points : 40 935
    Points
    40 935
    Billets dans le blog
    62
    Par défaut
    une solution , peut être ,chercher non pas la position du premier point ou virgule décimal au mais la dernière !
    cependant restera le cas où il n'y a pas de décimale mais seulement des séparateurs de milliers
    Citation Envoyé par chat qui respire = pastiche d'hamlet
    20.000 est-ce vingt avec trois décimales ou vingt mille ? that is the question
    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

  5. #5
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Oui, j'avais pensé en fait de :
    1- supprimer tous les espaces
    2- partir à l'envers du string reçu et détecter ou non . ou ,

    Maintenant le cas de ton petit chat , franchement depuis le temps ou je découpe des fichiers textes (compta, gestion) dans tous les sens je n'ai jamais eu de cas ou le séparateur de miliers était autre chose que rien ou espace, peut-être le fait que mes traitements concernent esclusivement des fichiers français donc dans mon cas pour moi c'est 20 (virgule) 000 et non 20000.

Discussions similaires

  1. Réponses: 12
    Dernier message: 31/05/2007, 15h19
  2. [TP] Déterminer la fréquence des voyelles dans un texte
    Par The future scientist dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 19/05/2007, 10h29
  3. enlever des espaces dans un texte
    Par juin29 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/03/2007, 16h45
  4. elinmination des blanc dans un text
    Par iam dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/05/2006, 17h07
  5. Réponses: 2
    Dernier message: 08/05/2006, 11h03

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