Précédent   Forum du club des développeurs et IT Pro > Environnements de développement > Delphi > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, FAQ, sources et autres ressources pour la rubrique Delphi.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/09/2012, 22h52   #1
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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.
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2012, 12h25   #2
Ph. B.
Expert Confirmé
 
Avatar de Ph. B.
 
Homme Philippe
Inscription : avril 2002
Messages : 1 033
Détails du profil
Informations personnelles :
Nom : Homme Philippe
Âge : 46
Localisation : France, Haute Garonne (Midi Pyrénées)

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

Informations forums :
Inscription : avril 2002
Messages : 1 033
Points : 2 667
Points : 2 667
Envoyer un message via ICQ à Ph. B. Envoyer un message via Skype™ à Ph. B.
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.
Ph. B. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/09/2012, 14h29   #3
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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).
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 11h59   #4
SergioMaster
Modérateur
 
Avatar de SergioMaster
 
Homme Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 4 217
Détails du profil
Informations personnelles :
Nom : Homme Serge Girard
Âge : 56
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 4 217
Points : 7 284
Points : 7 284
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
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/09/2012, 21h07   #5
BuzzLeclaire
Membre Expert
 
Avatar de BuzzLeclaire
 
Homme
Dev/For/Vte/Ass
Inscription : août 2008
Messages : 1 499
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 499
Points : 1 059
Points : 1 059
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.
BuzzLeclaire est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h40.


 
 
 
 
Partenaires

Hébergement Web