Format prédéfini monétaire

Résolu
ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007 - 17 avril 2007 à 16:22
ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007 - 20 juin 2007 à 15:55
Salut j'ai une question a propos des formats monétaires. Mon problème n'est pas que je ne suis pas capable de faire un arrondissement ou précisé un format (0.00). Je voudrais savoir si une fonction existe déjà dans Delphi pour faire ce que je veux.

Je m'explique
J'ai un logiciel qui calcul des prix avec des pourcentages, montants de rabais, des profits etc.
Je voudrais faire un option qui permet d'arrondir à des formats de ¢.

Exemple : Dans ma fenêtre d'option j'ai les choix d'arrondissement suivant : Aucun, 0.05$, 0.10$, 0.25$, 0.99$, 1.00$
Ce que je voudrais faire c'est d'arrondir un nombre avec les choix
Nombre avant        Choix         Nombre après
12,4813                 0.05$         12,40$
12,5634                 0.05$         12,60$
12,5536                 0.05$         12,55$

12,4813                 0.10$         12,50$
12,5943                 0.10$         12,60$
12,3348                 0.10$         12,30$

12,4813                 0.25$         12,50$
12,2136                 0.25$         12,25$
12,7369                 0.25$         12,75$

12,4813                 0.99$         12,99$
12,7618                 0.99$         12,99$

12,4813                 1.00$         13,00$
12,9178                 1.00$         13,00$

Je sais pas si vous comprenez quoi je veux faire mais pour l'instant je n'ai pas trouvé de fonction qui fait ce que je veux

P.S. Désolé si j'utilise des dollards, je reste au Canada

6 réponses

ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007
20 juin 2007 à 15:55
En fin de compte ça marche pas pentoute
j'ai fais ça a la place et ça marche pour tout les type d'arrondisement soit à la hausse ou a la baisse

function RoundMoney(const aNumber, aRoundType : Double) : Double;
var
  lCalcul : Double;
  lTempNumber : Double;
  lRoundValue : Double;
begin
  Result := aNumber;
  if aRoundType > 0 then
  begin
    lTempNumber := aNumber;
    if aNumber < 0 then
      lTempNumber := lTempNumber * -1;


    lCalcul := Frac(lTempNumber) / aRoundType;
    //LAISSER ABSOLUMENT CETTE LIGNE
    //Je suis obliger de faire ça parce que des fois ça marche pas
    //EXEMPLE : Frac(0.15) / 0.05 = (lCalcul est alors égal à 3);
    //                    Trunc(lCalcul) devrais donner 3 mais dans ce cas ça donne 2 fouillez moi pourquoi mais j'ai pas encore compris
    lCalcul := StrToFloat(FloatToStr(lCalcul));
    if Frac(lCalcul) > 0 then
    begin
      lRoundValue := (Trunc(lCalcul) + 1) * aRoundType;
      Result := Trunc(lTempNumber) + lRoundValue;
      if aNumber < 0 then
        Result := Result - aRoundType;
    end; 


    if aNumber < 0 then
      Result := Result * -1;
  end;
end;
3
ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007
17 avril 2007 à 16:25
Oups j'me suis tompé dans mon arrondissements de 0.05$
Nombre avant        Choix         Nombre après
12,4813                 0.05$         12,50$
12,5634                 0.05$         12,60$
12,5536                 0.05$         12,55$
12,4318                 0.05$         12,40$
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
23 avril 2007 à 20:31
Bonsoir

Cela ressemble fort à des calculs d'arrondis bancaire, mais es tu sur de tes calculs d'arrondis  ??

Je te propose deux fonctions au choix :

// Arrondi inférieur
function ArrondiBancaire ( const Nombre, Choix : extended ) : Extended ;
begin
  Result := Choix * ( Int( Nombre / Choix ) ) ;
end ;

// Arrondi supérieur
function ArrondiBancaire2 ( const Nombre, Choix : extended ) : Extended ;
begin
  Result := Choix * ( Int( ( Nombre + Choix ) / Choix ) ) ;
end ;

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007
24 avril 2007 à 14:38
Salut WhitHippo et merci de ta réponse. Ça fonctionne à moitier. Je t'explique
Quand je passe en paremètre "Choix" et que sa valeur est comprise entre 0.01 et 0.50 ça fonction très bien pour les arrondissements. Sauf que si je dépasse 0.51 ça ne marche pas très bien

Exemple avec une arrondissement de "0.99"
67.876 devrais donné 67.99 mais ça me donne 68.31
84.107 devrais donné 84.99 mais ça me donne 84.15

Je ne comprend pas trop pourquoi j'ai l'impression qu'il faudrais mettre une condition dans la formule
if choix > 0.5 then
   .......

Mais je ne suis pas vraiment la bol des maths
Je vais travaillé la dessus et je redonne des nouvelles, si jamais tu as de quoi tu me le diras
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ioda19 Messages postés 21 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 20 juin 2007
24 avril 2007 à 14:50
ÇA Y EST
après avoir envoyé mon message je me suis penché sur le sujet et la réponse m'est venu comme ça
j'ai modifier la fonction d'arrondissement à la hause (parce que c'est d'elle que j'avais de besoin)

voici ma petite modif qui fonctionne très bien
function TForm1.BankRound(const aNombre, aChoix : Extended) : Extended;
var
  lSubstract : Double;
begin
  if Frac(aChoix) > 0.5 then
  begin
    lSubstract := 1 - aChoix;
    Result := 1 * (Int((aNombre + 1) / 1));
    Result := Result - lSubstract;
  end
  else
    Result := aChoix * (Int((aNombre + aChoix) / aChoix));
end;

En fais quand les décimals sont plus grand que 0.50, je trouve le différence avec 1, d'où "1- aChoix"
Ensuite j'arrondis le nombre avec 1 et je soustrais le différence.


De ce que j'ai pu tester, tous fonctionne sans faute


MERCI WHITEHYPPO
0
WhiteHippo Messages postés 1154 Date d'inscription samedi 14 août 2004 Statut Membre Dernière intervention 5 avril 2012 3
24 avril 2007 à 15:57
Pour info ioda19, les formules d'arrondi fournies correspondent aux arrondis inférieur et supérieur d'un nombre au multiple spécifié, d'où les différences de résultats avec ce que tu espérais. Valeur   Multiple   Valeur arrondie

 18.567   0.99       18.81 =  19 x 0.99
 12.457   0.99       12.87 =  13 x 0.99
 18.567   0.13       18.59 = 143 x 0.13
 12.457   0.13       12.48 =  96 x 0.13
 18.567   0.05       18.55 = 371 x 0.05
 12.457   0.05       12.45 = 249 x 0.05

Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein
0
Rejoignez-nous