Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre émérite Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 920
    Points
    920

    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 :
    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 Philippe
    Inscrit en
    avril 2002
    Messages
    1 137
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2002
    Messages : 1 137
    Points : 3 024
    Points
    3 024

    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 émérite Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 920
    Points
    920

    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 Serge Girard
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    5 091
    Détails du profil
    Informations personnelles :
    Nom : Homme Serge Girard
    Âge : 57
    Localisation : France

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 5 091
    Points : 8 971
    Points
    8 971

    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
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  5. #5
    Membre émérite Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    août 2008
    Messages
    1 527
    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 527
    Points : 920
    Points
    920

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •