Format prédéfini monétaire [Résolu]

ioda19 21 Messages postés jeudi 10 juin 2004Date d'inscription 20 juin 2007 Dernière intervention - 17 avril 2007 à 16:22 - Dernière réponse : ioda19 21 Messages postés jeudi 10 juin 2004Date d'inscription 20 juin 2007 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

ioda19 21 Messages postés jeudi 10 juin 2004Date d'inscription 20 juin 2007 Dernière intervention - 20 juin 2007 à 15:55
+3
Utile
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;
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ioda19
ioda19 21 Messages postés jeudi 10 juin 2004Date d'inscription 20 juin 2007 Dernière intervention - 17 avril 2007 à 16:25
0
Utile
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$
Commenter la réponse de ioda19
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 23 avril 2007 à 20:31
0
Utile
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
Commenter la réponse de WhiteHippo
ioda19 21 Messages postés jeudi 10 juin 2004Date d'inscription 20 juin 2007 Dernière intervention - 24 avril 2007 à 14:38
0
Utile
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
Commenter la réponse de ioda19
ioda19 21 Messages postés jeudi 10 juin 2004Date d'inscription 20 juin 2007 Dernière intervention - 24 avril 2007 à 14:50
0
Utile
Ç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
Commenter la réponse de ioda19
WhiteHippo 1270 Messages postés samedi 14 août 2004Date d'inscription 5 avril 2012 Dernière intervention - 24 avril 2007 à 15:57
0
Utile
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
Commenter la réponse de WhiteHippo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.